Scala反序列化:找不到类

我试图理解在尝试序列化/反序列化非常简单的数据结构时发生的以下问题:

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)

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...