目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
クラスに対する互換性のない変更とは、相互運用性の保証が維持できないような変更です。クラスの展開の過程で起こる互換性のない変更には、次のものがあります。
- フィールドを削除する。クラスのフィールドが削除されると、書き込まれたストリームにはその値がない。そのストリームが以前のクラスによって読み込まれると、ストリームに値がないため、そのフィールドの値はデフォルト値に設定される。しかし、このデフォルト値は、以前のバージョンがその規約を果たす能力を損なうことがある
- 階層においてクラスを上方または下方に移動する。ストリームのデータ順序が正しくなくなるため、この変更はできない
- 非 static フィールドを static に、または 非 transient フィールドを transient に変更する。デフォルトの直列化を前提としている場合、この変更は、フィールドをクラスから削除するのと同じことである。そのクラスのこのバージョンでは、そのデータはストリームに書き込まれないので、そのクラスの以前のバージョンで読むことはできない。フィールドの削除と同じように、以前のバージョンのフィールドはデフォルト値に初期化されるので、そのクラスは予期できないエラーとなることがある
- プリミティブフィールドの宣言された型を変更する。クラスの各バージョンは、データをその宣言された型で書き込む。ストリームのデータの型はフィールドの型と一致しないので、クラスの以前のバージョンがそのフィールドを読み込もうとするとエラーになる
writeObject
やreadObject
メソッドを変更して、デフォルトのフィールドデータを書き込んだり、読み込んだりしないようにする。または、それらを変更して、前のバージョンがそのデータを書き込んだり読み込んだりしなかった場合、書き込んだり読み込んだりしようとする。デフォルトのフィールドデータがストリームにあるかないかは、一貫していなければならない- クラスを
Serializable
からExternalizable
に変更したり、その反対を行なったりするのは、互換性のない変更である。こうすると、そのストリームに、使用できるクラスの実装と互換性のないデータが入ることになるSerializable
やExternalizable
を取り除くのは、互換性のない変更である。こうすると、書き込まれたときに、そのクラスの古いバージョンで必要なフィールドが除外されることになるwriteReplace
またはreadResolve
メソッドをクラスに追加するときに、その動作がクラスの以前のバージョンと互換性がないオブジェクトを作成する場合は、互換性がなくなる