簡體   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