Delegates.observable()可以序列化吗?

给定一个班级

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