我正在尝试在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
,这是最简单的例子。
但是,如果我将TestClass
和serializeSomething()
的代码粘贴到repl
中,我就可以调用该函数,并且它工作得很好。
通过scalatest
与repl
调用我的函数会导致此异常时,有什么不同?
最后一个注意事项:如果我将调用从oos.writeObject(testItem)
更改为oos.writeObject("Hello")
,它工作得很好,即使从scalatest运行。
您需要在PersistenceSpec
之外定义TestClass
。内部类实例自动获得对外部类实例的引用。因此,当您将它写出来时,它也会尝试序列化PersistenceSpec
实例,这当然会失败。