Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 委托.observable()是否可以序列化?_Kotlin - Fatal编程技术网

Kotlin 委托.observable()是否可以序列化?

Kotlin 委托.observable()是否可以序列化?,kotlin,Kotlin,上课 class Pizza(name: String?) : Serializable { var name: String? by Delegates.observable(name, {_,_,_ -> }) } 为什么不能序列化?它与 Caused by: java.io.NotSerializableException: com.xxx.xxx.Pizza$$special$$inlined$observable$1 问题背后的原因是委托作为数组存储在合成的支持字段中

上课

class Pizza(name: String?) : Serializable {
    var name: String? by Delegates.observable(name, {_,_,_ -> })
}
为什么不能序列化?它与

Caused by: java.io.NotSerializableException: com.xxx.xxx.Pizza$$special$$inlined$observable$1

问题背后的原因是委托作为数组存储在合成的支持字段中,该字段既没有标记为瞬态也没有标记为可序列化,因此它阻止了序列化。但是,仅将属性标记为@Transient可能会破坏序列化表单。而且可能根本不起作用

在JetBrains决定最终解决此问题之前,您应该使用
writeReplace
readResolve
覆盖默认的序列化机制。我在下面提供了一个示例解决方案:

class Pizza(name: String?) : Serializable {
    @Transient var name: String? by Delegates.observable(name)
    private fun writeReplace(stream: ObjectOutputStream): Object = SerialProxy(name)
    private class SerialProxy(var name: String): Serializable {
        private fun readResolve(): Object = Pizza(name)
    }
}

readObject()/writeObject()不起作用,因为在调用构造函数后,您无法在不使用反射的情况下设置委托。

我无法编译您的代码,
可序列化
内部
委托。observable
接受两个参数。抱歉,这是一段代码的摘录,我将添加第二个参数。非常感谢,您的答案非常准确。但是我有一个问题,那就是我还需要知道初始值,我在可观察对象的回调中使用它。我猜使用writeReplace/readResolve我也必须传递初始值?不幸的是,这将是大量的样板文件。是的,SerialProxy也必须包含该属性,因为java序列化不知道对象的初始状态。