2016-06-09 187 views
3

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

@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

比方说,我先请它cloneThroughJson(x) 返回Y 我再次调用它在同一个函数cloneThroughJson(x)。并且它再次返回Y

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

+0

您能否提供[mcve]?你怎么知道它返回相同的实例? – 2016-06-09 08:51:41

回答

1

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

documentation

反序列化对象,GSON需要创建都是为了序列化和反序列化类 乖巧类的默认实例应该有一个无参数的构造函数 无论公有还是私有 通常情况下,在处理不定义无参数构造函数的库类时,需要实例创建器

实例创建R实施例

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

类型可以是相应的普通类型的

  • 非常有用的调用哪个需要特异性通用型信息
  • 例如构造,如果ID类存储类的量, Id正在创建中。
+0

我的类没有参数构造函数。 –