我有一个Kotlin对象,我正在尝试与Gson序列化。设置为委托的成员不会被序列化。如果我直接调用委托就行,就像onChange回调一样,但Gson只是忽略它。
有没有办法让Gson在不编写自定义序列化程序的情况下序列化?
以下是我正在尝试做的简化示例:
class MyDelegate() {
fun getProperty(): String {
return "myDelegate Property"
}
fun observableDelegate(onChange: () -> Unit): ReadWriteProperty<Any?, String> {
return object: ReadWriteProperty<Any?, String> {
override fun getValue(thisRef: Any?, property: KProperty<*>): String {
return getProperty()
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
TODO("not implemented")
}
}
}
}
class MyTest(delegate: MyDelegate, val property0: String = "property0" ) {
val property1 = "property1"
var property2 = "property2"
var property3: String by delegate.observableDelegate {
// onChange called
}
}
用以下方法测试:
@Test
fun testDelegate() {
val t1 = MyTest(MyDelegate())
val s1 = Gson().toJson(t1)
Assert.fail(s1)
}
输出:
{"property1":"property1","property2":"property2","property0":"property0"}
答案 0 :(得分:1)
property3
变量不是字段支持的。因此, Gson 不会将其视为 Json 序列化中的字段。
属性的GsonDesignDocument状态
一些Json库使用类型的getter来推断Json元素。我们选择使用非瞬态,静态或合成的所有字段(继承层次结构)。我们这样做是因为并非所有类都使用适当命名的getter编写。此外,getXXX或isXXX可能是语义而不是指示属性。
因此,您可能必须根据需要实现自定义(de)序列化程序。