一般情况下如何实现JsonSerializer的序列化?

时间:2014-03-03 16:29:40

标签: java json serialization gson jsonserializer

在手册there is a sample中,仅包含原始案例。

如果我的案子不原始怎么办?

假设我有一个类,它在默认序列化方面存在问题(在我的例子中是无限递归)。

Th类包含多个字段,其中一些是“main”并保存信息而另一个是service。

所以我需要仅序列化“主”字段并从中派生服务。

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关键字。但问题是关于编写序列化器。

更新

我强调使用瞬态不是答案。我的问题是关于自定义序列化程序。怎么写呢?

2 个答案:

答案 0 :(得分:1)

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

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

如果您只想序列化/反序列化字段MyType2 a,请使用MyTypeToSerialize(您不需要自定义序列化程序或反序列化程序)

编辑: @Brian Roach的建议是更好更容易的解决方案:

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

<强> EDIT2:

  

所以我需要仅序列化“主”字段并从中派生服务   它们。

因此请使用上述建议。

  

我知道我可以在这个特定情况下使用transient关键字。但是   问题是关于编写序列化器。

为什么你认为你需要序列化器?

答案 1 :(得分: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/,部分&#34;嵌套对象&#34;