【问题标题】:Create TypeAdapterFactory for data binding ObservableField为数据绑定 ObservableField 创建 TypeAdapterFactory
【发布时间】: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 委托或自定义设置器来通知更改。

标签: generics kotlin gson


【解决方案1】:

type 实际上应该实现 ParameterizedType 并且您必须获取 actualTypeArguments 的第一个元素才能获取泛型类型的适配器:

override fun <T> create(gson: Gson, type: TypeToken<T>): TypeAdapter<T>? {
    if (type.rawType != ObservableField::class.java) {
        return null
    }

    val paramType = (type as ParameterizedType).actualTypeArguments[0]
    return object : TypeAdapter<ObservableField<Any>>() {
        override fun read(reader: JsonReader): ObservableField<Any> {
          return ObservableField(gson.fromJson(reader, paramType))
        }

        override fun write(writer: JsonWriter, value: ObservableField<Any>) {
            gson.toJson(value.get(), paramType, writer)
        }
    }.nullSafe() as TypeAdapter<T>
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多