繁体   English   中英

Delegates.observable()是否可以序列化?

[英]Can Delegates.observable() be serializable?

上一堂课

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决定对此问题做出最终解决之前,您应该使用writeReplacereadResolve覆盖默认的序列化机制。 我在下面提供了一个示例解决方案:

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()不起作用,因为在调用构造函数后不使用反射就无法设置委托。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM