目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
JavaTM 言語仕様の第 13 章に、JavaTM クラスが展開するときのバイナリ互換の説明があります。バイナリ互換の柔軟性のほとんどは、クラス、インタフェース、フィールド、メソッドなどの名前のシンボリック参照を、遅い段階でバインドすることに起因しています。直列化されたオブジェクトストリームのバージョン管理を設計する場合の基本的な項目を、以下に示します。
- デフォルトの直列化機構は、ストリームのフィールドと、Virtual Machine の対応するクラスのフィールドとをバインドするのにシンボリックモデルを使用する
- ストリームの参照される各クラスは、それ自身、そのスーパータイプ、およびそのストリームに書き込まれた各直列化可能フィールドの型と名前を固有に識別する。これらのフィールドは、フィールド名によってソートされたプリミティブ型のものが最初にきて、次にフィールド名でソートされたオブジェクトフィールドが続く
- ストリームにはクラスごとに 2 つの型のデータが存在する。つまり、必須データ(オブジェクトの直列化可能フィールドに直接対応する)と任意データ(プリミティブとオブジェクトの任意のシーケンスからなる)である。クラス全体でも、必須の部分でも、任意の部分でも、必要に応じてスキップできるように、必須データと任意データをストリームにどのように指定するかは、ストリーム形式によって定義される
- 必須データは、クラス記述子によって定義された順序の、オブジェクトのフィールドからなる
- 任意データは、ストリームに書き込まれ、クラスのフィールドとは直接対応しない。この任意情報の長さ、型、バージョン管理はクラスそのものの責任である
writeObject
/readObject
メソッドがクラスに対して定義されていれば、それらが、そのクラスの状態を書き込みおよび読み込みするデフォルトの機構に代わって使用される。これらのメソッドは、クラスに対する任意データの書き込みと読み込みを行う。必須データは、defaultWriteObject
を呼び出すことによって書き込まれ、defaultReadObject
を呼び出すことによって読み込まれる- 各クラスのストリーム形式は、ストリーム固有識別子 (SUID) によって識別される。デフォルト値はそのクラスのハッシュである。そのクラスのそれよりあとのすべてのバージョンは、それらと互換性のあるストリーム固有識別子 (SUID) を宣言しなければならない。これにより、同じ名前を持つ複数のクラスが、単一クラスのバージョンであると間違って認識されることはない
ObjectOutputStream
とObjectInputStream
のサブタイプは、annotateClass
メソッドを使って、クラスを識別する独自の情報を持つことができる。たとえば、MarshalOutputStream
には、クラスの URL が組み込まれている