我试图了解尝试序列化/反序列化非常简单的数据结构时发生的以下问题:
case class SimpleClass(i: Int)
object SerializationDebug {
def main(args: Array[String]) {
val c = SimpleClass(0)
val l1 = List(c)
serializationSaveToFile("test", l1)
val l2 = serializationLoadFromFile("test") // .asInstanceOf ...
}
def serializationSaveToFile(fn: String, o: Any) {
val fos = new FileOutputStream(fn)
val oos = new ObjectOutputStream(fos)
oos.writeObject(o)
oos.close()
}
def serializationLoadFromFile(fn: String): Any = {
val fis = new FileInputStream(fn)
val ois = new ObjectInputStream(fis)
return ois.readObject()
}
}
尝试运行此代码时,我进入java.lang.ClassNotFoundException: SimpleClass
了反序列化步骤。我目前的调查结果是:
- 该示例在我
SimpleClass
通过某些内置类型进行交换时有效,即我可以反序列化List[Int]
或List[(Int, Double)]
没有问题。将内置类型与 mySimpleClass
(即具有 aList[Any]
)再次混合会引发异常。 - 我试图
SimpleClass
在其他范围内定义(例如嵌套在对象或本地范围内),但这并没有改变任何东西。此外,扩展普通(非大小写)类Serializable
会产生相同的结果。 - 更令人费解的是,使用
Array[SimpleClass]
而不是List
确实有效!尝试其他容器证实了这种奇怪的不一致:SimpleClass
在不可变映射中使用类型参数是可行的,如果是可变映射,我会遇到异常。
以防万一:我的 Scala 版本是 2.10.0;JDK 是 1.7.0。
这里发生了什么?这应该失败还是某种错误?我手头的实际问题涉及更复杂的数据结构(大量嵌套;内置类和自有类的混合)。任何以最小侵入的简单方式(即无需找到容器类及其类型参数的工作组合)序列化/反序列化此数据结构的建议也欢迎!