【问题标题】:Serializing an Enum that implements an interface with Gson序列化实现与 Gson 的接口的 Enum
【发布时间】:2017-03-28 14:55:43
【问题描述】:

我有一些需要序列化的库代码。一个字段被定义为接口Foo,它只是一个标记接口。客户端代码应该创建一个实现Foo 的 Enum,以便它们可以根据需要扩展子类型列表。

我无法在 Gson 中使用类型适配器对其进行序列化。我得到的例外是:

java.lang.IllegalStateException:不是 JSON 对象:“SETUP”

其中 setup 是客户端枚举 Bar 的一个元素。

我添加了一个TypeAdapter,将Foo 定义为超类型,Bar 定义为子类型,使用 Gson RuntimeTypeAdapter 代码(来自 Google 的 Gson 助手)。关于我做错了什么的任何想法,或者 Gson 不支持这种结构?

我相信我可以通过将 Foo 设为抽象类并将 Setup 设为子类来解决问题,但这有点不太好,因为枚举实际上只是一个标记。

【问题讨论】:

  • 如果您发布异常堆栈跟踪,至少是出于原因,MCVE 和您正在使用的 Gson 版本。

标签: java gson


【解决方案1】:

我认为这个问题与这样一个事实有关,因为您正在实现一个接口,Gson 需要一个类,但却得到一个枚举。这可能是一个错误,我得深入研究一下。

无论如何,我认为解决您的问题的最佳方法可能是为注释实现自定义序列化器/反序列化器。你的接口需要子类实现一个 name() 方法(你应该已经实现了,因为它是一个枚举),然后调用它来进行序列化。

这是一个例子:

public class MyInterfaceSerializer implements JsonSerializer<MyInterface> {

public JsonElement serialize(MyInterface src, Type typeOfSrc,
        JsonSerializationContext context) {

    return context.serialize(src.name());
}

反序列化基本相同,但反序列化器(可以并且应该是同一个类)将实现 JsonDeserializer 并实例化您的枚举。

【讨论】:

  • 您是否设法重现了 OP 遇到的错误?我既不能再现类映射也不能再现单个枚举值。
  • “Gson 需要一个对象,但得到一个枚举”,枚举是一个对象
  • @Aurasphere 我知道并且同意你的结论,只是措辞不同
  • @SeanPatrickFloyd 对不起,我不擅长措辞......这就是为什么我是程序员而不是诗人:P ahaha
  • “你的接口需要子类来实现一个 name() 方法(你应该已经实现了,因为它是一个枚举),然后调用它来进行序列化。”是的,这就是我的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2011-12-12
  • 2020-05-04
  • 1970-01-01
  • 2020-04-14
相关资源
最近更新 更多