在手册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
关键字。但问题是关于编写序列化器。
更新
我强调使用瞬态不是答案。我的问题是关于自定义序列化程序。怎么写呢?
答案 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;