【问题标题】:Serializing a Scala class that extends a Java class: value lost?序列化扩展 Java 类的 Scala 类:价值丢失?
【发布时间】:2012-04-23 06:39:07
【问题描述】:

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 会话,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

那么,为什么 bar.i 在这种情况下不是 1?

【问题讨论】:

  • 你试过让 Foo 可序列化吗? (public class Foo implements Serializable)。
  • 我刚刚在我提供的测试用例中尝试过,并且有效。但是,这是一个简化的测试用例。在我的实际问题中,我无权访问 Java 代码,也无法添加“实现可序列化”。

标签: java scala serialization


【解决方案1】:

这是意料之中的,我相信与 Scala 无关。 Non-Serializable 超类不会被序列化(因为它们不可序列化!),因此它们的值将由默认构造函数初始化。

如果您想以某种方式保存超类,则需要覆盖您的 readObject 和 writeObject 以手动保存状态。或者,使用更灵活的序列化解决方案,编写 XML、JSON 等并使用反射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多