Scala 反序列化 : class not found

标签 scala serialization 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()
  }  
}

尝试运行此代码时,我得到 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/

    相关文章:

    c++ - 将结构序列化为文件,并用字符串再次反序列化

    斯卡拉拼图 : enforcing that two function arguments are of the same type AND both are a subtype of a given class

    scala - 如何在列表中找到匹配的元素并将其映射为Scala API方法?

    php如何序列化对象数组?

    java - Avro 反序列化错误 - ArrayIndexOutOfBoundsException

    jackson - 从 Spring Batch 3 迁移到 4

    eclipse - java.lang.NoSuchMethodError : main when starting HelloWorld with Eclipse Scala plugin

    scala - 有没有办法在编译时测试一个常量是编译时常量?

    php - 使用接受序列化对象作为值的 PDO 将模式对象动态存储到数据库的函数

    c# - 如何在 C# 中序列化和反序列化以字节数组作为成员的类