【问题标题】:Java Clone object using GSON使用 GSON 的 Java 克隆对象
【发布时间】:2016-06-09 08:42:30
【问题描述】:

我必须多次克隆一个对象。我的对象是不可序列化的。我正在使用以下功能

@SuppressWarnings("unchecked")
public static  T cloneThroughJson(T t) {
   Gson gson = new Gson();
   String json = gson.toJson(t);
   return (T) gson.fromJson(json, t.getClass());
}
// ...
Object cloned = cloneThroughJson(someObject);

我发现这每次都会返回对同一个对象的引用。例如

假设我首先调用它为cloneThroughJson(x) 它返回Y 我再次在同一个函数中调用它cloneThroughJson(x)。它再次返回Y

你知道如何在 java 中使用深度克隆克隆不可序列化的对象吗?

【问题讨论】:

标签: java clone


【解决方案1】:

这似乎是一个已知问题。如果复制的对象具有默认的无参数构造函数,您的方法将起作用。为了实现你想要的 - 你需要创建一个实例创建者。

来自documentation

在反序列化对象时,Gson 需要创建该类的默认实例 用于序列化和反序列化的行为良好的类应该有一个无参数的构造函数 不管是公开的还是私人的 通常,当您处理未定义无参数构造函数的库类时,需要 Instance Creators

实例创建者示例

private class MoneyInstanceCreator implements InstanceCreator<Money> {
  public Money createInstance(Type type) {
    return new Money("1000000", CurrencyCode.USD);
  }
}

类型可以是对应的泛型类型

  • 对于调用需要特定泛型类型信息的构造函数非常有用
  • 例如,如果 Id 类存储要为其创建 Id 的类。

【讨论】:

  • 我的类没有参数构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2020-03-07
  • 2021-11-01
相关资源
最近更新 更多