私は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
}
ありがとう、