5.6.2 互換性のある変更
クラスへの互換性のある変更は、次のように処理されます。
- フィールドの追加 - 再構成されるクラスにストリームにないフィールドがあると、オブジェクトのそのフィールドはその型に対するデフォルト値に初期化される。クラス固有の初期化が必要な場合、そのクラスは readObject メソッドによって、そのフィールドをデフォルト値以外に設定することができる
- クラスの追加 - ストリームには、ストリームにおける各オブジェクトの型階層がある。ストリームのこの階層と現在のクラスを比較すれば、追加のクラスがわかる。ストリームには、そのオブジェクトを初期化するために使用できる情報はないので、そのクラスのフィールドはデフォルト値に初期化される
- クラスの削除 - ストリームのクラス階層と現在のクラスを比較すれば、クラスが削除されたことがわかる。この場合、そのクラスに対応するフィールドとオブジェクトが、ストリームから読み込まれる。プリミティブフィールドは破棄されるが、削除されたクラスによって参照されるオブジェクトは作成される。 こうするのは、それらがあとからストリームで参照される可能性があるからである。ストリームがガベージコレクトされたり、リセットされたりするときに、それらのオブジェクトはガベージコレクトされる
-
writeObject/readObject メソッドの追加 - ストリームを読み込むバージョンにこれらのメソッドがある場合、デフォルトの直列化によってストリームに書き込まれた必須データは、通常どおり readObject によって読み込まれなければならない。このメソッドは、任意データを読み込む前に、まず defaultReadObject を呼び出す必要がある。writeObject メソッドは、通常どおり、defaultWriteObject を呼び出して必須データを書き込まなければならない。 その後、任意データを書き込むことができる
-
writeObject/readObject メソッドの削除 - このストリームを読み込むクラスにこれらのメソッドがないと、必須データはデフォルトの初期化によって読み込まれ、任意データは破棄される
-
java.io.Serializable の追加 - これは、型を追加するのと同じことである。ストリームにはこのクラスに対する値がないので、そのフィールドは、デフォルト値に初期化される。直列化不能クラスのサブクラス化をサポートするには、そのクラスのスーパータイプに引数なしのコンストラクタがあり、そのクラス自身がデフォルト値に初期化されなければならない。引数なしのコンストラクタがないと、InvalidClassException がスローされる
- フィールドへのアクセスを変更 - アクセス修飾子 public、package、protected、private を変更しても、直列化によってそれらのフィールドに値を代入できることには影響しない
- フィールドの static から非 static へ、または transient から非 transienst への変更 - デフォルトの直列化で直列化可能フィールドを計算する場合、この変更は、フィールドをクラスに追加するのと同じことである。新しいフィールドはストリームに書き込まれるが、その値は以前のクラスによって無視される。 これは、直列化によって static や transient のフィールドに値が代入されないためである
目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.