【问题标题】:How to implement JsonSerializer's serialize in general case?一般情况下如何实现 JsonSerializer 的序列化?
【发布时间】:2014-04-04 19:28:20
【问题描述】:

在手册there is a sample 中,仅包含原始大小写。

如果我的情况不是原始的怎么办?

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

类包含多个字段,其中一些是“主要”字段并保存信息,而另一些是服务字段。

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

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

更新

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

【问题讨论】:

  • 不清楚你在这里问什么。如果您不想在序列化程序中序列化某些字段,您只需......不会将它们添加到您返回的 JsonElement 中。
  • 如何只将a 添加到JsonElement?知道JsonElement是抽象类,怎么加东西?

标签: java json serialization gson jsonserializer


【解决方案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
}

编辑2:

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

所以使用上面的建议。

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

您认为为什么需要序列化程序?

【讨论】:

  • 只需将b 标记为transient 即可。
  • @BrianRoach 我知道transient,但我的问题是关于自定义序列化程序。
  • @aegean 我不想更改类层次结构,我想编写自定义序列化程序,保持类结构不变。
【解决方案2】:

应该使用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/,“嵌套对象”部分

【讨论】:

  • 我不明白你为什么不想使用瞬态属性?为什么需要自定义序列化程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2011-10-31
相关资源
最近更新 更多