目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
java.io.Externalizable
を実装するオブジェクトは、readExternal
メソッドを実装して、そのオブジェクトの状態全体を復元しなければなりません。このオブジェクトは、そのスーパークラスと連携してそれらの状態を復元する必要があります。ObjectInput
のすべてのメソッドが、そのオブジェクトのプリミティブ型のフィールドとオブジェクトフィールドを復元するために使用できます。public void readExternal(ObjectInput stream) throws IOException;
注 -readExternal
メソッドは public であるため、クライアントがストリームの既存オブジェクトを上書きしてしまう危険性があります。クラスで独自にチェックを追加して、適切なときにだけ呼び出されるようにすることもできます。
JDKTM 1.2 では、Externalizable
オブジェクトの問題を修正するために、新しいストリームプロトコルのバージョンが導入されました。Externalizable
オブジェクトの以前の定義では、ストリームからExternalizable
オブジェクトを適切に読み込めるようにするために、ローカルの仮想マシンがreadExternal
メソッドを探す必要がありました。新しい形式では、十分な情報がストリームプロトコルに追加されるので、ローカルのreadExternal
メソッドが使えない場合は、直列化でExternalizable
オブジェクトをスキップすることができます。クラスの展開規則により、ローカルクラスを使ったオブジェクトのマッピングがない場合は、入力ストリーム内のExternalizable
オブジェクトはスキップできます。また、新しい
Externalizable
ストリーム形式では、ObjectInputStream
によって、利用可能な範囲を超える外部データの読み込み試行を検出し、readExternal
メソッドによって消費されていないデータをスキップできるという利点もあります。外部データの終端を過ぎた読み取りに応答するObjectInputStream
の動作は、クラス定義のreadObject
メソッドが任意指定データの終端を超えて読み込もうとしたときの動作と同じです。バイトの読み込みでは-1
を返し、プリミティブの読み込みではEOFException
をスローし、オブジェクトの読み込みでは、eof
フィールドをtrue
に設定したOptionalDataException
をスローします。この形式の変更のため、JDKTM 1.1.6 以前のリリースでは、この新しい形式を読み込むことができません。JDKTM 1.1.6 以前で、
PROTOCOL_VERSION_2
に書き込まれたストリームからExternalizable
オブジェクトを読み込もうとすると、StreamCorruptedException がスローされます。互換性の問題については、「6.3 ストリームプロトコルのバージョン」を参照してください。