我必须多次克隆一个对象.我的对象是不可序列化的.我正在使用以下功能
@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中的非序列化对象吗?
看来这是一个已知问题。仅当复制的对象具有默认的无参数构造函数时,您的方法才有效。为了实现你想要的 - 你需要创建一个实例创建者。
来自文档:
反序列化对象时,Gson 需要创建该类的默认实例 用于序列化和反序列化的行为良好的类应该有一个无参构造函数 不管是公共还是私有 通常,当您需要时,需要实例创建者处理未定义无参构造函数的库类
实例创建者示例
Run Code Online (Sandbox Code Playgroud)private class MoneyInstanceCreator implements InstanceCreator<Money> { public Money createInstance(Type type) { return new Money("1000000", CurrencyCode.USD); } }类型可以是相应的泛型类型
- 对于调用需要特定泛型类型信息的构造函数非常有用
- 例如,如果 Id 类存储为其创建 Id 的类。