私は、Serializableを実装するパブリッククラスを持っています。これは複数の他のクラスによって拡張されています。以前はスーパークラスではなく、それらのサブクラスしか以前にシリアル化されていませんでした。Javaのシリアル化 - java.io.InvalidClassExceptionローカルクラスの互換性がありません
スーパークラスはserialVersionUIDを定義していました。
私はそれが重要なのかどうかわからないんだけど、それはプライベートマークされていなかったのではなく、それだけでデフォルトの保護を持っていた - あなたはそれがパッケージだったと言うかもしれないが
static final long serialVersionUID = -7588980448693010399L;
スーパークラス、またのいずれかを保護しましたただし、サブクラスはreadObjectまたはwriteObjectを実装しており、明示的に定義されたserialVersionUIDを持つサブクラスはありません。私は、スーパークラスで定義されたもので十分であると考えました。
これにもかかわらず、新しいインスタンス変数、List/ArrayList、新しいメソッドがスーパークラスに追加され、いくつかのプライベートインスタンス変数が追加されるまで、以前にシリアライズされたオブジェクトを読み返すまでは問題ありませんでしたそのサブクラスの1つ。
これまでにシリアル化されたオブジェクトを読み取ろうとすると、例外がスローされます。これと同様のもの:私はサブクラスのいずれか1つを宣言していないので、使用されたデフォルトのserialVersionUIDのは、今、変更されているので、私はこれを仮定してい
com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196
が原因スーパークラスの変化に起因しています1つのサブクラス。
このジレンマから脱出する方法についてのご意見をいただければ幸いです。私はreadObjectとwriteObjectを実装する必要があると仮定していますが、defaultReadObject()とdefaultWriteObject()を呼び出す以外に、私は何をする必要があるのか正確にはわかりません。 serialVerisonUIDをすべてのサブクラスに追加する必要があるかどうか、または各サブクラスでreadObjectとwriteObjectを実装する必要があるかどうか、またはスーパークラスで一度だけ実装することができるかどうかはわかりません。
...古いクラスがない場合は、例外メッセージから古いserialVersionUIDを取得し、必要に応じて繰り返します。 –
あなたの答えと[truthealitiy's](http://stackoverflow.com/a/10378907/712526)には、すべての関連する詳細が含まれています。たぶん質問が合併される可能性がありますか? – jpaugh