非常に単純なデータ構造をシリアル化/逆シリアル化しようとすると発生する次の問題を理解しようとしています。
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)]
組み込み型と my を混在さSimpleClass
せる (つまり、 を持つList[Any]
) と、再び例外がスローされます。- 他のスコープで定義しようとし
SimpleClass
ました (たとえば、オブジェクトまたはローカル スコープにネストされているなど) が、何も変わりませんでした。また、通常の (大文字と小文字を区別しない) クラスを拡張Serializable
しても、同じ結果が得られます。 - さらに困惑するのは、
Array[SimpleClass]
代わりにを使用すると機能するList
ことです! 他のコンテナーを試してみると、この奇妙な矛盾が確認SimpleClass
されます。不変マップ内に型パラメーターを指定すると機能しますが、可変マップの場合は例外が発生します。
重要な場合: 私の Scala バージョンは 2.10.0 です。JDK は 1.7.0 です。
ここで何が起こっているのですか?これは失敗するはずですか、それとも何らかのバグですか? 私が直面している実際の問題は、はるかに複雑なデータ構造 (多数のネスト、組み込みクラスと独自クラスの混合) に関係しています。このデータ構造のシリアライズ/デシリアライズを最小限に抑えた簡単な方法 (つまり、コンテナ クラスとその型パラメータの有効な組み合わせを見つける必要なし) への提案も大歓迎です!