2015-07-02 66 views
3

我有一個標記爲瞬態的字段的POJO。 GSON不會序列化它。大。但是,當它被反序列化時,它將清除該字段的初始設置。GSON反序列化瞬變爲空

舉例來說,如果我有這樣的對象:

public class ObjWithTransient { 
    public String name; 
    public transient List<String> listOStrings = new ArrayList(); 
} 

我運行這個測試:

@Test 
public void testSerializeWithTransient() throws Exception { 
    ObjWithTransient obj = new ObjWithTransient(); 
    obj.name = "Foobar"; 
    String json = gson().toJson(obj); 

    // Deserialize 
    ObjWithTransient obj2 = GsonUtil.gson().fromJson(json, ObjWithTransient.class); 
    Assert.assertEquals(obj2.name, "Foobar"); 
    Assert.assertNotNull(obj2.listOStrings); // <--- Fails here 
    Assert.assertEquals(obj2.listOStrings.size(), 0); 
} 

通過標記它短暫的,我以爲我告訴GSON忽略它,但似乎並非如此。這裏保留初始設置的最佳方法是什麼?

編輯: 我認爲這個問題是因爲沒有聲明的構造函數。這不適用於內部類,但是具有普通類或靜態內部類似乎起作用。讀取GSON代碼時,它會嘗試多種創建對象的方式,但最終會使用UnsafeConstructor創建它,如果沒有其他作用。這將創建一個空白條目的對象。我也可以添加一個InstanceCreator來告訴Gson如何創建對象。

+0

這裏沒有提供真正的答案,但這可能有所幫助:http://camelcode.org/tutorial/Exclude-fields-from-JSON-with-java-modifiers-using-Gson.htm –

回答

1

我認爲這個問題是因爲沒有聲明的構造函數。這不適用於內部類,但是具有普通類或靜態內部類似乎起作用。讀取GSON代碼時,它會嘗試多種創建對象的方式,但最終會使用UnsafeConstructor創建它,如果沒有其他作用。這將創建一個空白條目的對象。我也可以添加一個InstanceCreator來告訴Gson如何創建對象。