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