使用GSON的Java克隆对象

使用GSON的Java克隆对象,java,clone,Java,Clone,我必须多次克隆一个对象。我的对象是不可序列化的。我正在使用以下函数 @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 = cloneThrou

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

@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);
我发现每次引用同一个对象时,都会返回这个值。e、 g

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


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

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

发件人:

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

实例创建者示例

private class MoneyInstanceCreator implements InstanceCreator<Money> {
  public Money createInstance(Type type) {
    return new Money("1000000", CurrencyCode.USD);
  }
}
私有类MoneyInstanceCreator实现InstanceCreator{
公款createInstance(类型){
返还新货币(“1000000”,货币代码:美元);
}
}
类型可以是相应的泛型类型

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

你能提供一份报告吗?你怎么知道它返回的是同一个实例?我的类没有参数构造函数。