2014-03-03 60 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

相关问题