使用Gson序列化实现接口的枚举类型

3

我有一些库代码需要序列化。其中一个字段被定义为接口Foo,它只是一个标记接口。客户端代码应该创建一个实现Foo的枚举类型Bar,以便在需要时扩展子类型列表。

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

java.lang.IllegalStateException: Not a JSON Object: "SETUP"

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

我添加了一个TypeAdapterFoo定义为超类型,将Bar定义为子类型,使用Gson RuntimeTypeAdapter代码(来自Google的Gson助手)。有什么建议吗?我做错了什么,或者这种结构Gson不支持吗?

我认为我可以通过将Foo变成一个抽象类并让Setup成为一个子类来解决问题,但这样做略微不好,因为枚举类型只是一个标记。


如果您至少提供异常堆栈跟踪、一个最小可复现示例(MCVE)以及您正在使用的Gson版本,那将非常好。 - Lyubomyr Shaydariv
1个回答

1
我认为问题与你实现一个接口有关,但Gson期望的是一个类,而不是枚举。这可能是一个错误,我需要深入研究一下。
无论如何,我认为解决你问题的最佳方案可能是为注释实现自定义序列化程序/反序列化程序。你的接口将需要子类实现name()方法(由于它是一个枚举,你应该已经实现了它),然后调用该方法进行序列化。
以下是一个示例:
public class MyInterfaceSerializer implements JsonSerializer<MyInterface> {

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

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

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

1
你能重现OP遇到的错误吗?我无法为类映射或单个枚举值重现。 - Lyubomyr Shaydariv
1
"Gson 期望得到一个对象,但实际上却得到了一个枚举类型。" 枚举类型也是一种对象。 - Sean Patrick Floyd
1
@Aurasphere 我理解并同意你的结论,只是对措辞有所保留。 - Sean Patrick Floyd
1
@SeanPatrickFloyd 对不起,我在措辞方面不太好...这就是为什么我是一名程序员而不是诗人:P 哈哈 - Aurasphere
1
你的接口将要求子类实现一个name()方法(因为它是枚举类型,所以你应该已经实现了),然后调用它来进行序列化。是的,这就是我在这里的意思。 - Aurasphere
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接