2017-06-22 85 views
0

提供类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 
+0

我无法编译你的代码,'Serializable'是'internal','Delegates.observable'需要2个参数。 –

+0

对不起,这是一段代码的摘录,我将添加第二个参数。 – Pin

回答

2

您的问题背后的原因是代表被存储为在合成支持字段既不是标记为瞬态也不serialziable阵列,所以它防止了序列化。然而,仅仅用@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()可以不工作,因为你没有办法来设置委托构造函数,而无需使用反射调用后。

+0

非常感谢,你的答案是点亮的。虽然我有一个问题,那就是我也需要知道在observable的回调中使用的初始值。我想使用writeReplace/readResolve我也必须通过初始值?不幸的是,这将是很多样板。 – Pin

+0

是的,SerialProxy也必须包含该属性,因为java序列化不知道对象的初始状态。 – glee8e

相关问题