Scala内部case类不可序列化



我正在尝试在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中,我就可以调用该函数,并且它工作得很好。

通过scalatestrepl调用我的函数会导致此异常时,有什么不同?

最后一个注意事项:如果我将调用从oos.writeObject(testItem)更改为oos.writeObject("Hello"),它工作得很好,即使从scalatest运行。

您需要在PersistenceSpec之外定义TestClass。内部类实例自动获得对外部类实例的引用。因此,当您将它写出来时,它也会尝试序列化PersistenceSpec实例,这当然会失败。

相关内容

  • 没有找到相关文章

最新更新