blu*_*e10 5 serialization scala deserialization scala-2.10
我试图理解在尝试序列化/反序列化非常简单的数据结构时发生的以下问题:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
尝试运行此代码时,我进入java.lang.ClassNotFoundException: SimpleClass反序列化步骤.我目前的调查结果如下:
SimpleClass通过某种内置类型进行交换时,该示例有效,即我可以反序列化List[Int]或List[(Int, Double)]没有问题.将内置类型与my SimpleClass(即具有a List[Any])混合会再次抛出异常.SimpleClass在其他范围内定义(例如嵌套在对象或本地范围内),但这并没有改变任何东西.此外,具有正常(非大小写)类扩展Serializable会产生相同的结果.Array[SimpleClass]而不是List工作!尝试其他容器确认了这种奇怪的不一致:SimpleClass在不可变映射中使用as类型参数,如果是可变映射,我会得到异常.如果重要:我的Scala版本是2.10.0; JDK是1.7.0.
这里发生了什么?这应该是失败还是某种错误?我手边的实际问题涉及更复杂的数据结构(大量嵌套;内置类和自有类的混合).任何建议以最小的侵入式简单方式序列化/反序列化这个数据结构(即无需找到容器类及其类型参数的工作组合)也是受欢迎的!
小智 7
这个解决方案适合我:
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) }
}
}
Run Code Online (Sandbox Code Playgroud)
当然,在编写对象时,我们使用相同的方式:
val ois = new ObjectOutputStream(new FileOutputStream(path))
ois.writeObject(myobject)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2117 次 |
| 最近记录: |