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