【问题标题】:Serialization of Scala ObjectsScala 对象的序列化
【发布时间】:2019-03-04 13:18:48
【问题描述】:

我正在关注basic example of scala object serialization。但是,在运行以下单元测试时

package mytest

import java.io.{ByteArrayOutputStream, ObjectOutputStream}

import org.scalatest.{Matchers, WordSpec}

class BasicSerializationSpec extends WordSpec with Matchers {

  @SerialVersionUID(123L)
  class TestRecord(var content: String) extends Serializable {
    override def toString = s"TestRecord($content)"
  }

  "A TestRecord" should {
    "be serializable" in {
      val oo = new ObjectOutputStream(new ByteArrayOutputStream())

      val tr = new TestRecord("42")

      oo.writeObject(tr)

      oo.close
    }
  }
}

我得到一个例外:

org.scalatest.Assertions$AssertionsHelper java.io.NotSerializableException: 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 在 mytest.BasicSerializationSpec.$anonfun$new$2(BasicSerializationSpec.scala:20)

我已尝试显式设置类型

val tr : java.io.Serializable = new TestRecord("42")

但还是没有运气。

如何正确地将 scala 对象序列化为 java ObjectOutputStream

这不是 other stack answers 的重复,因为我显然是在使用我的类声明扩展 Serializable

提前感谢您的考虑和回复。

【问题讨论】:

    标签: java scala serialization


    【解决方案1】:

    序列化内部类在 Java 和 Scala 中都是一个雷区,但前提是在您的真实代码中没有引用 TestRecord 中的 BasicSerializationSpec 的成员,您应该能够通过添加 @ 来完成这项工作987654323@内部类定义的修饰符:

    final class TestRecord(var content: String) extends Serializable {
    

    在实际代码中,您不太可能测试您在测试类中定义的类,但在测试内部类时可能会遇到类似情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 2019-06-11
      • 1970-01-01
      • 2019-02-03
      • 2017-08-02
      • 2015-11-14
      • 2020-08-14
      • 2022-12-14
      相关资源
      最近更新 更多