2014-03-03 63 views
0

在手冊there is a sample中,僅包含原始情況。如何在一般情況下實現JsonSerializer的序列化?

如果我的情況不是原始的呢?

假設我有一個類,它有一個默認序列化的問題(在我的情況下,它是無窮遞歸)。

Th類包含多個字段,其中一些是「主」,另一個是服務。

所以我需要只序列化「主」字段,並從它們派生服務。

class MyType1 { 
    MyType2 a; // "main" field 
    MyType3 b; // service fiels 
} 

class MySerializer implements JsonSerializer<MyType1> { 
    @Override 
    public JsonElement serialize(MyType1 arg0, Type arg1, JsonSerializationContext arg2) { 
     JsonObject ans = new JsonObject(); 
     // ans.add("a", ... // what to write here? How to wrap a into JsonElement? 
     return ans; 
    } 
} 

我知道我可以使用關鍵字transient對於這種特殊情況下。但問題是關於編寫序列化程序。

UPDATE

我強調的是,使用瞬態不是一個答案。我的問題是關於自定義序列化器。如何寫他們?

+0

目前還不清楚你問這裏。如果你不想在你的序列化程序中序列化某些字段,那麼......不會將它們添加到你要返回的JsonElement中。 –

+0

如何只給'JsonElement'添加'a'?如何添加任何東西到'JsonElement',知道它是抽象類? –

回答

1
class MyTypeToSerialize { 
    MyType2 a; // "main" field 
} 

class MyType1 extends MyTypeToSerialize { 
    MyType3 b; // service fiels 
} 

如果你只是想現場MyType2 a是序列化/反序列化,然後用MyTypeToSerialize(你不需要自定義序列化或解串器)

編輯: @布賴恩羅奇的建議是更好,更容易解決方案:

class MyType1 { 
    MyType2 a; // "main" field 
    transient MyType3 b; // service fiels 
} 

EDIT2:

所以我只需要序列化「主」字段並從 派生服務的他們。

因此,使用上述建議。

我知道我可以在這個特定情況下使用transient關鍵字。但是 的問題是關於編寫串行器。

爲什麼你認爲你需要序列化?

+2

只需將'b'標記爲'transient'就可以做同樣的事情。 –

+0

+1更好的建議 – Devrim

+0

@BrianRoach我知道'瞬態',但我的問題是關於自定義串行器。 –

0

應該使用context.serialize委託,像這樣:

class MySerializer implements JsonSerializer<MyType1> { 
    @Override 
    public JsonElement serialize(MyType1 arg0, Type arg1, JsonSerializationContext arg2) { 
     JsonObject ans = new JsonObject(); 
     JsonElement a = arg2.serialize(a); 
     ans.add("a", a); 
     return ans; 
    } 
} 

我在這裏找到了答案:http://www.javacreed.com/gson-serialiser-example/,部分「嵌套對象」

+0

我無法理解你爲什麼不想使用瞬態屬性?爲什麼你需要一個自定義序列化器? – Devrim

相關問題