目次 | 前の項目 | 次の項目 Java オブジェクト直列化仕様


3.7 readResolve メソッド

Serializable クラスと Externalizable クラスの場合、クラスは readResolve メソッドを使うことによって、呼び出し側に返される前に、ストリームから読み込んだオブジェクトを置換または解釈処理できます。readResolve メソッドを実装することによって、クラスは、クラス自体の直列化復元されているインスタンスの型およびインスタンスを直接制御できます。このメソッドは、次のように定義します。

	ANY-ACCESS-MODIFIER Object readResolve()
    		throws ObjectStreamException;
readResolve メソッドは、ObjectInputStream がストリームからオブジェクトを読み込み、呼び出し側に返す準備をしているときに呼び出されます。ObjectInputStream は、オブジェクトのクラスによって readResolve メソッドが定義されるかどうかを確認します。このメソッドが定義される場合は、readResolve メソッドが呼び出されて、ストリーム内のオブジェクトは、オブジェクトが返されるよう指定できるようになります。返されるオブジェクトは、すべての使用場面で互換性がある型でなければなりません。互換性がない場合は、型の不一致が発見された時点で ClassCastException がスローされます。

たとえば、Symbol クラスは、仮想マシン内で各シンボルバインディングにインスタンスが 1 つだけ存在する Symbol クラスを生成することもできます。そのシンボルがすでに定義されているかどうか、およびアイデンティティの制約を守るために、以前から存在する Symbol オブジェクトをそのシンボルに取り替えるかどうかを決定する readResolve メソッドを実装します。このようにして、直列化における Symbol オブジェクトの一意性を守ることができます。


注 - オブジェクトが完全に構築されるまでは readResolve メソッドはオブジェクトに呼び出されないため、そのオブジェクトのオブジェクトグラフへの参照は、readResolve によって指定された新しいオブジェクトに更新されません。しかし、writeReplace メソッドによるオブジェクトの直列化の間に、置換オブジェクトのオブジェクトグラフにある元のオブジェクトへの参照はすべて、置換オブジェクトへの参照に置き換えられます。したがって、直列化されたオブジェクトが置換オブジェクトを指定し、その置換オブジェクトのオブジェクトグラフが元のオブジェクトへの参照を持つ場合、直列化復元を行うと、不正なオブジェクトグラフが作成されます。さらに、writeReplace によって指定された読み込み対象のオブジェクトと元のオブジェクトの参照タイプに互換性がない場合、オブジェクトグラフを構築する際に ClassCastException が発生します。


目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.