2016-06-09 52 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

我的類沒有參數構造函數。 –