當使用-Xcheckinit編譯器選項並在可序列化的類中實現我自己的readObject方法時,我無法調用readObject方法在我的類的主體中聲明的字段上的任何訪問器函數。聲明爲構造函數參數的字段是可以的。當我嘗試訪問在類體中聲明的字段時,我得到一個scala.UninitializedFieldError。如何防止-Xcheckinit干擾Scala對象的反序列化?
也就是說,即使在上一行設置了y之後,以下代碼在readObject方法中的println(y)
上失敗!
@serializable case class XYPointWithRWAndPrint(var x: Int) {
var y = 0
@throws(classOf[java.io.IOException])
private def writeObject(out: java.io.ObjectOutputStream) {
out.writeInt(x)
out.writeInt(y)
}
@throws(classOf[java.io.IOException])
@throws(classOf[ClassNotFoundException])
private def readObject(in: java.io.ObjectInputStream) {
x = in.readInt()
println(x)
y = in.readInt()
println(y)
}
}
爲什麼?
不錯。手動添加32個以上的惰性val會導致2個位圖字段。我想這對初始化檢查是一樣的。 – axel22 2010-10-06 20:39:03
哦,對於懶惰的vals,我想我們必須設計一個稍微複雜的序列化/反序列化例程。 – axel22 2010-10-06 21:07:44