使用Gson

时间:2018-03-19 14:31:05

标签: kotlin gson

我有一个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 个答案:

答案 0 :(得分:1)

property3变量不是字段支持的。因此, Gson 不会将其视为 Json 序列化中的字段。

属性的GsonDesignDocument状态

  

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

因此,您可能必须根据需要实现自定义(de)序列化程序。