[英]Serializing a Scala class that extends a Java class: value lost?
福.java
public class Foo{
public int i = 0;
}
酒吧.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 session,序列化前bar為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?
這是預料之中的,我相信與 Scala 無關。不可序列化的超類不會被序列化(因為它們不可序列化。)因此它們的值將由默認構造函數初始化。
如果您想以某種方式保存超類,則需要覆蓋 readObject 和 writeObject 以手動保存 state。 或者,使用更靈活的序列化解決方案,寫入 XML、JSON 等並使用反射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.