序列化实现Gson接口的Enum

时间:2017-03-28 14:55:44

标签: java gson

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

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

  

java.lang.IllegalStateException:不是JSON对象:" SETUP"

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

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

我相信我可以通过使Foo成为一个抽象类并将Setup作为子类来解决这个问题,但是因为枚举实际上只是一个令牌,所以它不太好。

1 个答案:

答案 0 :(得分:1)

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

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

以下是一个例子:

override func loadView() {
    super.loadView()

    let camera = GMSCameraPosition.camera(withLatitude: -33.868,
                                          longitude: 151.2086,
                                          zoom: 14)
    let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
    view = mapView
}

反序列化基本相同,但反序列化器(可能且应该是同一个类)将实现public class MyInterfaceSerializer implements JsonSerializer<MyInterface> { public JsonElement serialize(MyInterface src, Type typeOfSrc, JsonSerializationContext context) { return context.serialize(src.name()); } 并实例化你的枚举。