Scala对象的序列化

Ram*_*gil 1 java serialization scala

我正在跟踪scala对象序列化基本示例。但是,运行以下单元测试时

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

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

我试图明确设置类型

val tr : java.io.Serializable = new TestRecord("42")
Run Code Online (Sandbox Code Playgroud)

但是仍然没有运气。

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

这不是其他堆栈答案的重复,因为我显然在扩展Serializable我的类声明。

预先感谢您的考虑和回应。

Tra*_*own 5

Serializing inner classes is a minefield in both Java and Scala, but provided that in your real code there are no references to BasicSerializationSpec's members in TestRecord, you should be able to make this work by adding a final modifier to the inner class definition:

final class TestRecord(var content: String) extends Serializable {
Run Code Online (Sandbox Code Playgroud)

In real code you're unlikely to be testing classes that you define inside your test class, but you may run into similar situations when testing inner classes.