10

scala @serializable オブジェクトを Java Serializable オブジェクトと同じように使用できることを理解しました。Java Serializable オブジェクトには、オブジェクトのストリーム方法を変更するためにオーバーライドできるメソッドがあります: writeObject(ObjectOutputStream) / readObject(ObjectOutputStream)。

オブジェクトのシリアル化方法を変更できるように、scala @serializable オブジェクトにメソッドをオーバーライドまたは注入できますか?

4

2 に答える 2

10

はい、Java と同じメソッドを Scala でも使用できます。

@throws(classOf[IOException])
private def writeObject(out: ObjectOutputStream): Unit = // ...

@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...
于 2010-08-09T19:59:11.513 に答える
3

すでに述べたように、独自のwriteObjectメソッドとreadObjectメソッドを定義できます。

@throws(classOf[java.io.IOException])
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition  here */

ただし、ネストされたクラス、オブジェクト、またはトレイトでこれを実行する場合は注意が必要です。

@serializable class Foo(x:Int){@serializable object X {def y = x}}

オブジェクトXをシリアル化すると、実際には含まれているFooクラスがシリアル化されるため、これもシリアル化可能である必要があります。これは、カスタムシリアル化メソッドで処理するPITAになる可能性があるため、ここに公正な警告があります。

もう1つの問題点は、クロージャーのシリアル化です。シリアル化されたクロージャでキャプチャされている変数のメンタルモデルを維持するようにしてください。これらの変数がIOを介して送信したいものであることを確認してください。

于 2010-08-11T01:49:31.727 に答える