【发布时间】:2012-11-23 01:36:02
【问题描述】:
我对 scala 编程语言很陌生,我目前需要做以下事情。我有一个如下的 signleton 对象:
object MyObject extends Serializable {
val map: HashMap[String, Int] = null
val x: int = -1;
val foo: String = ""
}
现在我想避免必须单独序列化这个对象的每个字段,因此我正在考虑将整个对象写入一个文件,然后在下一次执行程序时读取文件并初始化单例对象从那里。有没有办法做到这一点?
基本上我想要的是当序列化文件不存在时,将这些变量初始化为新结构,而当它存在时,从文件中的字段初始化字段。但我想避免手动序列化/反序列化每个字段...
更新:
我必须使用此处介绍的自定义反序列化器:https://issues.scala-lang.org/browse/SI-2403,因为我在 HashMap 中作为值使用的自定义类存在问题。
更新2:
这是我用来序列化的代码:
val store = new ObjectOutputStream(new FileOutputStream(new File("foo")))
store.writeObject(MyData)
store.close
以及要反序列化的代码(在不同的文件中):
@transient private lazy val loadedData: MyTrait = {
if(new File("foo").exists()) {
val in = new ObjectInputStream(new FileInputStream("foo")) {
override def resolveClass(desc: java.io.ObjectStreamClass): Class[_] = {
try { Class.forName(desc.getName, false, getClass.getClassLoader) }
catch { case ex: ClassNotFoundException => super.resolveClass(desc) }
}
}
val obj = in.readObject().asInstanceOf[MyTrait]
in.close
obj
}
else null
}
谢谢,
【问题讨论】:
-
我们很乐意看到这个问题:)
-
在这里 :) 出于某种原因,它在我写完之前就发布了......
-
出于好奇,这是干什么用的?读取配置文件,也许?
-
基本上,我正在开发一个系统,出于持久性原因,我希望将其主要数据结构写入文件。数据结构将(最终:))变得非常大,这就是我想避免必须单独序列化每个字段的原因。
-
旁注:避免在 Scala 中使用
null。它实际上只存在于与 Java 的互操作性。如果某些内容可以为“空”,请改用Option。
标签: scala serialization singleton deserialization