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序列化不知道对象的初始状态。