[英]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決定對此問題做出最終解決之前,您應該使用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()不起作用,因為在調用構造函數后不使用反射就無法設置委托。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.