Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化扩展Java类的Scala类:值丢失?_Java_Scala_Serialization - Fatal编程技术网

序列化扩展Java类的Scala类:值丢失?

序列化扩展Java类的Scala类:值丢失?,java,scala,serialization,Java,Scala,Serialization,Foo.java public class Foo{ public int i = 0; } 斯卡拉酒吧 class Bar() extends Foo with Serializable{ i = 1 } 通过Josh Seureth进行序列化 REPL会话,序列化前的bar为1,序列化后为0 scala -cp . Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.

Foo.java

public class Foo{
  public int i = 0;
}
斯卡拉酒吧

class Bar() extends Foo with Serializable{
  i = 1 
}
通过Josh Seureth进行序列化

REPL会话,序列化前的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以手动保存状态。或者,使用更灵活的序列化解决方案,编写XML、JSON等并使用反射。

您是否尝试过使Foo可序列化?(
公共类Foo实现了可序列化的
)。我刚刚在我给出的测试用例中尝试了这一点,效果很好。然而,这是一个简化的测试用例。在我的实际问题中,我无法访问Java代码,无法添加“implements Serializable”。
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