我尝试在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运行,它也能正常工作。
1条答案
按热度按时间flseospp1#
你需要在
PersistenceSpec
的外部定义TestClass
,内部类示例会自动获得一个对外部类示例的引用,所以当你把它写出来的时候,它也会尝试序列化PersistenceSpec
示例,当然会失败。