使用GSON的Java Clone对象

Par*_*ary 5 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 = cloneThroughJson(someObject);
Run Code Online (Sandbox Code Playgroud)

我发现每次引用同一个对象时都会返回.例如

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

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

Yur*_*uri 2

看来这是一个已知问题。当复制的对象具有默认的无参数构造函数时,您的方法才有效。为了实现你想要的 - 你需要创建一个实例创建者。

来自文档

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

实例创建者示例

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

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

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