問題: クラス A は Serializable を実装します クラス B は A を拡張し、Serializable を実装します
ここで、クラス B をランタイム タイプとしてのみ使用してシリアライズします。だから私はリストを持っています:
List<A> lst = new ArrayList<A>();
lst.add(new B());
...
objectOutputStream.writeObject(lst.get(i)); //this write compiler-type A, runtime-type B
ここで逆シリアル化すると、java.io.OptionalDataException エラーが発生します。とにかく疑問に思っているのは、私のオブジェクトが正しいランタイムタイプになる方法です。逆シリアル化:
A a = (A) objectInputStream.readObject();
これは、シリアライゼーション時にクラス B のランタイム タイプにつながるか、または A の ear サブクラスのデフォルトのシリアライゼーションを上書きする必要がありますか?
明らかなことを見逃さなかったことを願っています。
前もって感謝します : )
編集:
すべての回答のおかげで、自分の過ちを理解するのに本当に役立ちました。
私が(答えたように) in.read(arr); を使用したため、例外がスローされました。それはデータを完全に読み取らないことにつながるため、オブジェクトを正しく逆シリアル化できませんでした(もちろんそうではありません)- readFully に変更した後、期待どおりに機能しました。