目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
基本構造では、ストリーム内でオブジェクトを表す必要があります。オブジェクトのクラス、フィールド、およびクラス固有のメソッドによって書き込まれ、後で読み取られるデータなどの属性を表現する必要があります。ストリームのオブジェクトの表現は、ある文法によって記述することができます。null オブジェクト、新規オブジェクト、クラス、配列、文字列、およびすでにストリームにあるオブジェクトへのバック参照に対し、特別な表現があります。ストリームに書き込まれた各オブジェクトには、このオブジェクトをバック参照するために使用するハンドルが割り当てられます。ハンドルは、0x7E0000 から始めて順次割り当てられます。ストリームがリセットされると、ハンドルは再び 0x7E0000 から始まります。
ダイナミックプロキシクラス以外のクラスのObjectStreamClass
オブジェクトは、次の要素によって表されます。
- 互換クラスのストリーム固有識別子 (SUID)
- そのクラスに
writeObject
メソッドが定義されているどうかを示すフラグ- 直列化可能フィールドの数
- デフォルトの機構によって直列化されたクラスのフィールドの配列。配列やオブジェクトでは、フィールドの型が文字列として格納される。この文字列は、「JavaTM Virtual Machine Specification, Second Edition」の 4.3.2 に指定されているフィールド記述子の形式 (例:
Ljava/lang/Object;
) でなければならないannotateClass
メソッドによって書き込まれる任意指定のブロックデータレコードまたはオブジェクトObjectStreamClass
のスーパータイプ (スーパークラスが直列化可能でなければ null)
ダイナミックプロキシクラスのObjectStreamClass
オブジェクトは、次の要素によって表されます。
String
オブジェクトの表現は、UTF 方式で符号化された文字列長に依存しています。String
の UTF エンコーディング長が 65536 バイト未満の場合は、String
は、標準の Java UTF-8 形式で書き込まれます。JavaTM 2 SDK, Standard Edition, v1.3 からは、文字列の UTF エンコーディング長が 65536 バイト以上の場合は、「長い」UTF 形式で書き込まれるようになりました。「長い」UTF 形式は、標準の Java UTF-8 形式と同じですが、2 バイトではなく 8 バイトで UTF 文字列を書き込みます。直列化ストリームのString
の前にあるタイプコードは、String
の書き込みに使用された形式を表しています。
ストリームの新規オブジェクトは次の要素によって表されます。
- 直列化可能フィールド。 「1.5 クラスの直列化可能なフィールドの指定」を参照
- そのクラスに
writeObject
/readObject
メソッドがあれば、writeObject
メソッドによって書き込まれた、プリミティブ型の任意指定のオブジェクトおよび (または) ブロックデータレコードと、それに続いてendBlockData
がある場合がある
クラスによって書き込まれたすべてのプリミティブデータは、ブロックデータレコードにバッファリングされ、ラップされます。これは、そのデータがwriteObject
メソッドの中でストリームに書き込まれたのか、writeObject
メソッドの外から直接ストリームに書き込まれたのかには関係ありません。このデータは、対応するreadObject
メソッドによって読み込むか、ストリームから直接読み込むことができます。writeObject
メソッドによって書き込まれたオブジェクトは、前に書き込まれたブロックデータレコードがあればそれを停止し、正規オブジェクト、null、またはバック参照のどれかのうちで、適切なものとして書き込まれます。ブロックデータレコードでは、エラーの回復によって任意指定データを破棄することができます。クラスの中から呼び出された場合には、ストリームはデータやオブジェクトをendBlockData
まで破棄することができます。