Scala内部case类不可序列化

kdfy810k  于 2022-12-23  发布在  Scala
关注(0)|答案(1)|浏览(135)

我尝试在Scala中对一个非常简单的case类进行非常基本的序列化:

import org.scalatest.wordspec.AnyWordSpecLike
import java.io.{ByteArrayOutputStream, ObjectOutputStream}

class PersistenceSpec extends AnyWordSpecLike{
  case class TestClass(name: String) extends Serializable

  def serializeSomething(): ByteArrayOutputStream = {
    val testItem = TestClass("My Thing")
    val bos: ByteArrayOutputStream = new ByteArrayOutputStream()
    val oos = new ObjectOutputStream(bos)
    oos.writeObject(testItem)
    bos
  }

  "serializeSomething" when {
    "executed" must {
      "successfully serialize" in {
        val outputStream = serializeSomething()
        println(outputStream.toString())
      }
    }
  }
}

当我运行这个测试时,我在调用oos.writeObject(testItem)时得到一个java.io.NotSerializableException,这是没有意义的,因为case类自动实现Serializable,这是最简单的例子。
但是,如果我将TestClassserializeSomething()的代码粘贴到repl中,我就能够调用该函数,并且它工作得很好。
通过scalatest调用函数与通过repl调用函数有什么不同,会导致此异常?
最后一点:如果我将调用从oos.writeObject(testItem)更改为oos.writeObject("Hello"),那么即使从scalatest运行,它也能正常工作。

flseospp

flseospp1#

你需要在PersistenceSpec的外部定义TestClass,内部类示例会自动获得一个对外部类示例的引用,所以当你把它写出来的时候,它也会尝试序列化PersistenceSpec示例,当然会失败。

相关问题