我最终实现了一个自定义转换器和工厂,以使其正确地插入到Genson中。
它使用了Genson的元数据约定来表示对象,如下所示:
{
"@class": "com.example.ViewModel.Loading"
}
转换器假定设置了"useClassMetadata"标志,因此序列化只需要标记一个空对象。对于反序列化,它从元数据中解析类名,加载它并获取"objectInstance"。
object KotlinObjectConverter : Converter<Any> {
override fun serialize(objectData: Any, writer: ObjectWriter, ctx: Context) {
with(writer) {
beginObject()
endObject()
}
}
override fun deserialize(reader: ObjectReader, ctx: Context): Any? =
Class.forName(reader.nextObjectMetadata().metadata("class"))
.kotlin.objectInstance
.also { reader.endObject() }
}
为了确保该转换器只应用于实际的
对象,我使用工厂进行注册,告诉Genson何时使用它以及何时回退到默认实现。
object KotlinConverterFactory : Factory<Converter<Any>> {
override fun create(type: Type, genson: Genson): Converter<Any>? =
if (TypeUtil.getRawClass(type).kotlin.objectInstance != null) KotlinObjectConverter
else null
}
可以使用工厂模式通过构建器来配置Genson:
GensonBuilder()
.withConverterFactory(KotlinConverterFactory)
.useClassMetadata(true)
.create()
代码可能可以使用链接的转换器功能更加简洁,但我还没有时间去验证。