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

相關問題