【发布时间】:2018-12-04 19:12:36
【问题描述】:
我正在使用 ObservableField 进行数据绑定,我想使用 GSON 反序列化。
class Foo: Observable {
var bar: ObservableField<String>? = null
}
如果我不提供 TypeAdapter,GSON 将尝试反序列化为对象而不是字符串。
我的类型适配器工厂和类型适配器:
class ObservableFieldTypeAdapterFactory: TypeAdapterFactory {
override fun <T> create(gson: Gson, type: TypeToken<T>): TypeAdapter<T>? {
if (type.rawType != ObservableField::class.java) {
return null
}
return object : TypeAdapter<ObservableField<Any>>() {
override fun read(reader: JsonReader): ObservableField<Any> {
// get the generic type of the ObservableField and let GSON
// deserialize it
val field = someDelegate.read(reader)
// wrap it
return ObservableField(field)
}
override fun write(out: JsonWriter?, value: ObservableField<Any>) {
throw UnsupportedOperationException()
}
}.nullSafe() as TypeAdapter<T>
}
}
我不知道如何告诉 GSON 解析 ObservableField 的泛型:
// get the generic type of the ObservableField and let GSON deserialize it
val field = someDelegate.read(reader)
如何委托 GSON 解析字符串字段以便包装它?我可以检查它是否是一个字符串字段,但是这个适配器不支持 Ints 或任何通用对象。
我需要用 peek 检查读取的字段类型吗?然后用适当的删除打开每个字段类型?
【问题讨论】:
-
如果
Foo实现的Observable也来自数据绑定库,请考虑扩展BaseObservable并将所有属性用作普通类型。您可以使用 Kotlin 委托或自定义设置器来通知更改。