4

Foo.java

public class Foo{
  public int i = 0;
}

Bar.scala

class Bar() extends Foo with Serializable{
  i = 1 
}

Josh Seurethによるシリアル化https://stackoverflow.com/a/3442574/390708

import java.io._

  class Serialization{
    def write(x : AnyRef) {
    val output = new ObjectOutputStream(new FileOutputStream("test.obj"))
    output.writeObject(x)
    output.close()
  }

  def read[A] = {
    val input = new ObjectInputStream(new FileInputStream("test.obj"))
    val obj = input.readObject()
    input.close()
    obj.asInstanceOf[A]
  }
}

REPL セッション、バーはシリアル化前は 1 ですが、シリアル化後は 0 です。

scala -cp .
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_03).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val bar = new Bar
bar: Bar = Bar@2d2ab673

scala> bar.i
res0: Int = 1

scala> :load Serialization.scala
Loading Serialization.scala...
import java.io._
defined class Serialization

scala> val serialization = new Serialization
serial: Serialization = Serialization@41a45f89

scala> serialization.write(bar)

scala> val bars = serialization.read[Bar]
bars: Bar = Bar@5a9948fd

scala> bars.i
res3: Int = 0

では、この場合、bars.i が 1 でないのはなぜでしょうか?

4

1 に答える 1

8

これは予想されることであり、Scala とは何の関係もないと思います。Non-Serializable スーパークラスは (シリアライズ可能でないため) シリアライズされないため、それらの値はデフォルトのコンストラクターによって初期化されます。

何らかの方法でスーパークラスを保存したい場合は、状態を手動で保存するために readObject と writeObject をオーバーライドする必要があります。または、XML、JSON などを記述し、リフレクションを使用する、より柔軟なシリアル化ソリューションを使用します。

于 2012-04-10T23:57:40.073 に答える