我有一些库代码需要序列化。一个字段被定义为接口(interface) Foo,它只是一个标记接口(interface)。客户端代码应该创建一个实现 Foo
的枚举。 ,以便他们可以根据需要扩展子类型列表。
我无法使用类型适配器在 Gson 中序列化它。我得到的异常(exception)是:
java.lang.IllegalStateException: Not a JSON Object: "SETUP"
其中设置是客户端枚举的一个元素 Bar
.
我添加了一个 TypeAdapter
定义 Foo
作为父类(super class)型和 Bar
作为子类型,使用 Gson RuntimeTypeAdapter
代码(来自谷歌的 Gson 助手)。关于我做错了什么的任何想法,或者 Gson 不支持这种结构?
我相信我可以通过制作 Foo
来解决这个问题一个抽象类和Setup
是一个子类,但这有点不太好,因为枚举实际上只是一个标记。
最佳答案
我认为这个问题与这样一个事实有关,因为你正在实现一个接口(interface) Gson 期望一个类但是得到一个枚举。这可能是一个错误,我将不得不对其进行更深入的研究。
无论如何,我认为解决您的问题的最佳方法是为注释实现自定义序列化器/反序列化器。您的接口(interface)将需要子类来实现 name() 方法(您应该已经实现了,因为它是一个枚举),然后调用它来进行序列化。
这是一个例子:
public class MyInterfaceSerializer implements JsonSerializer<MyInterface> {
public JsonElement serialize(MyInterface src, Type typeOfSrc,
JsonSerializationContext context) {
return context.serialize(src.name());
}
反序列化基本相同,但反序列化器(可以而且应该是同一个类)将实现 JsonDeserializer
并实例化您的枚举。
关于java - 序列化实现与 Gson 接口(interface)的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43072960/