我试图理解在尝试序列化/反序列化一个非常简单的数据结构时出现的以下问题:
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)]
没有问题。将内置类型与我的 SimpleClass
混合使用(即具有 List[Any]
)再次引发异常。 SimpleClass
在其他范围内(例如嵌套在对象中或甚至在本地范围内),但这并没有改变任何东西。此外,有一个正常(非大小写)类扩展 Serializable
给出相同的结果。 Array[SimpleClass]
而不是 List
确实有效!尝试其他容器证实了这种奇怪的不一致:有 SimpleClass
由于不可变映射中的类型参数有效,在可变映射的情况下,我得到异常。 如果重要:我的 Scala 版本是 2.10.0; JDK 是 1.7.0。
这里发生了什么?这是应该失败还是某种错误?我手头的实际问题涉及更复杂的数据结构(大量嵌套;内置类和自己的类的混合)。也欢迎任何以最小侵入性简单方式(即无需找到容器类及其类型参数的工作组合)序列化/反序列化此数据结构的建议!
最佳答案
这个解决方案对我来说很好:
val ois = new ObjectInputStream(new FileInputStream(fileName)) {
override def resolveClass(desc: java.io.ObjectStreamClass): Class[_] = {
try { Class.forName(desc.getName, false, getClass.getClassLoader) }
catch { case ex: ClassNotFoundException => super.resolveClass(desc) }
}
}
当然,在写对象的时候,我们也是用同样的方式:
val ois = new ObjectOutputStream(new FileOutputStream(path))
ois.writeObject(myobject)
关于Scala 反序列化 : class not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386252/