我有一些我需要序列化的库代码。一个字段被定义为接口Foo,它只是一个标记接口。客户端代码应该创建一个实现Foo
的枚举,以便他们可以根据需要扩展子类型列表。
我无法使用类型适配器在Gson中序列化它。我得到的例外是:
java.lang.IllegalStateException:不是JSON对象:" SETUP"
其中setup是客户端枚举Bar
的一个元素。
我添加了一个TypeAdapter
,使用Gson Foo
代码(来自Google的Gson帮助程序)将Bar
定义为超类型并将RuntimeTypeAdapter
定义为子类型。关于我做错了什么的想法,还是Gson不支持这种结构?
我相信我可以通过使Foo
成为一个抽象类并将Setup
作为子类来解决这个问题,但是因为枚举实际上只是一个令牌,所以它不太好。
答案 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());
}
并实例化你的枚举。