gpt4 book ai didi

Scala 反序列化 : class not found

转载 作者:行者123 更新时间:2023-12-04 18:10:01 24 4
gpt4 key购买 nike

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

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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com