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


3.4 readObject メソッド

Serializable オブジェクトの場合、readObject メソッドによって、クラスがそれ独自のフィールドの直列化復元を制御することができます。そのシグニチャーを次に示します。

    private void readObject(ObjectInputStream stream)
        throws IOException, ClassNotFoundException;
Serializable オブジェクトの各サブクラスは、それ独自の readObject メソッドを定義することができます。このメソッドがクラスに実装されていない場合は、defaultReadObject によって与えられるデフォルトの直列化が使用されます。実装されている場合は、そのクラスは、そのスーパータイプやサブタイプのフィールドではなく、それ独自のフィールドだけを復元する責任があります。

クラスの readObject メソッドが実装されていれば、そのメソッドはそのクラスの状態を復元する責任があります。transient または static かどうかには関係なく、オブジェクトのすべてのフィールドの値に、そのフィールドタイプのデフォルトの値が設定されます。defaultReadObject は、対応する writeObject メソッドによって書き込まれた任意指定のデータを読み込む前に、呼び出されなければなりません。このクラスの readObject メソッドが、このクラスに対するストリームの任意指定部分に存在するデータより多くのデータを読み込もうとすると、ストリームは EOFException をスローします。この任意指定データの形式、構造体、バージョン管理の責任のすべては、そのクラスにあります。任意指定データの形式および構造を文書化する場合は、readObject メソッドに対する javadoc コメント内の @serialData javadoc タグを使う必要があります。

復元するクラスが、読み込まれているストリームにないと、そのフィールドは適切なデフォルト値に初期化されます。

ObjectInputStream からの読み込みは、新しいオブジェクトの作成に似ています。新しいオブジェクトのコンストラクタがスーパークラスからサブクラスという順番で呼び出されるのと同様に、ストリームから読み込まれるオブジェクトは、スーパークラスからサブクラスに直列化復元されます。直列化復元中には、各 Serializable サブクラスに対して、コンストラクタではなく readObject または defaultReadObject メソッドが呼び出されます。

コンストラクタと readObject メソッドでもう 1 つ似ている点は、どちらも、完全に構築されていないオブジェクト上にメソッドを呼び出すことができる点です。オブジェクトの構築中に呼び出されるオーバーライド可能なメソッド (private、static、final のどれでもないもの) は、サブクラスによってオーバーライドされる可能性があります。オブジェクトの構築段階に呼び出されるメソッドは、コンストラクタか readObject メソッドによって現在初期化されている型ではなく、そのオブジェクトの実際の型によって解釈処理されます。したがって、readObject メソッド内からオーバーライド可能なメソッドを呼び出すと、スーパークラスが完全に初期化される前に意図しないサブクラスが呼び出される可能性があります。



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