使用Gson将Kotlin委托进行序列化

3
我有一个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"}
1个回答

1
property3变量没有后备字段。因此,GsonJson序列化中不将其视为字段。 GsonDesignDocument中针对属性的说明如下:

一些Json库使用类型的getter来推断Json元素。我们选择使用所有字段(向上继承层次结构),这些字段不是瞬态的、静态的或合成的。我们这样做是因为并非所有类都编写了适当命名的getter。此外,getXXX或isXXX可能是语义而不是指示属性。

因此,您可能需要为自己的需求实现自定义(de)serializer。

谢谢,盯着代理中的getValue()调用大约一分钟后,我也得出了这个结论。 - Gary Bak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接