目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
JavaTM 言語仕様の第 13 章に、JavaTM クラスが展開するときのバイナリ互換の説明があります。バイナリ互換の柔軟性のほとんどは、クラス、インタフェース、フィールド、メソッドなどの名前のシンボリック参照を、遅い段階でバインドすることに起因しています。直列化されたオブジェクトストリームのバージョン管理を設計する場合の基本的な項目を、以下に示します。
- デフォルトの直列化機構は、ストリームのフィールドと、仮想マシンの対応するクラスのフィールドとをバインドするのにシンボリックモデルを使用します
- ストリーム内で参照される各クラスは、自らのクラス、そのスーパータイプ、およびストリームに書き込まれる各直列化フィールドのタイプと名前を一意に識別します。フィールドの順序は、まずプリミティブ型のフィールドがフィールド名でソートされ、次にオブジェクトフィールドがフィールド名でソートされて決定されます
- 各クラスのストリームに出現するデータは、必須データ (オブジェクトの直列化可能フィールドに直接対応する) と任意データ (プリミティブやオブジェクトの任意のシーケンスで構成される) の 2 種類に分けられます。ストリーム形式は、必須データおよび任意データをストリーム内で生成する方法を定義します。この定義により、必要に応じてクラス全体、必須データ、または任意データをスキップすることが可能です
- 必須データは、クラス記述子で定義された順序でソートされた、オブジェクトのフィールドで構成されます
- | 任意データは、ストリームに書き込まれ、クラスのフィールドに直接対応しません。クラス自体は、オプション情報の長さ、タイプ、およびバージョン管理を担当します。 |
- クラスを定義すると、その
writeObject
/readObject
メソッドはクラスの状態を読み込み/書き込みするためのデフォルトの機構に取って代わります。これらのメソッドは、クラスの任意データの読み取りおよび書き込みを実行します。必須データへの書き込みはdefaultWriteObject
の呼び出しを介して、必須データの読み取りはdefaultReadObject
の呼び出しを介して行われます。- 各クラスのストリーム形式の識別は、ストリーム固有識別子 (SUID) を使って行われます。デフォルトでは、ストリーム固有識別子は、クラスのハッシュです。以降のバージョンのクラスでは、すべて、互換性のあるストリーム固有識別子 (SUID) を宣言する必要があります。これにより、同じ名前を持つ複数のクラスを、不注意で単一のクラスのバージョンとみなしてしまうことを防げます。
ObjectOutputStream
およびObjectInputStream
のサブタイプには、annotateClass
を使って、クラスを識別する独自の情報を含めることができます。たとえば、MarshalOutputStream
はクラスの URL を埋め込んでいます。