java - 序列化实现与 Gson 接口(interface)的枚举

标签 java gson

我有一些库代码需要序列化。一个字段被定义为接口(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/

相关文章:

java - 具有 Collection 字段的对象的 GSON 自定义序列化程序

java - 使用键名包含句点 (.) 的 gson 解析 JSON

java - Spring @Autowired - 实例化新 bean

java - 奇怪的 SocketExceptions : connection reset and Connection timed out

node.js - 如何在node js中将gson转换为json?

java - 改造预期为 BEGIN_OBJECT,但为 BEGIN_ARRAY

android - 使用 GSON 库从 URL(RESTful web 服务)解析 JSON 字符串。安卓

java - 如何检查1个字符串中有多少字符空间

java - 尝试运行 Powershell 脚本时出现 Java ProcessBuilder 错误

java - ASM 3.3.1 中缺少 ASMifier 类