目次 | 前の項目 | 次の項目 | Java オブジェクト直列化仕様 |
オブジェクトやプリミティブをストリームに書き込むことは、複雑な処理ではありません。例を示します。// Serialize today's date to a file. FileOutputStream f = new FileOutputStream("tmp"); ObjectOutput s = new ObjectOutputStream(f); s.writeObject("Today"); s.writeObject(new Date()); s.flush();まずOutputStream
(この場合はFileOutputStream
) が、このバイトを受け取るために必要です。次に、FileOutputStream
に書き込むObjectOutputStream
が作成されます。そして、文字列「Today」と日付オブジェクトがストリームに書き込まれます。通常、オブジェクトはwriteObject
メソッドによって書き込まれ、プリミティブはストリームにDataOutput
のメソッドによって書き込まれます。
writeObject
メソッド (「2.3 writeObject メソッド」を参照) は、指定されたオブジェクトを直列化し、オブジェクトグラフ内の指定オブジェクトから他のオブジェクトへの参照を再帰的に移動して、そのグラフの完全に直列化した表現を作成します。ストリーム内でオブジェクトに対する初めての参照があると、そのオブジェクトが直列化または外部化され、そのオブジェクトのハンドルが割り当てられます。そのオブジェクトに対するそれ以後の参照は、そのハンドルとしてコード化されます。オブジェクトハンドルを使用すれば、オブジェクトにおいて当然起こる共用参照や循環参照が保存されます。オブジェクトのそれ以後の参照ではそのハンドルだけを使用するため、非常に簡潔な表現が可能になります。型が
Class
、ObjectStreamClass
、String
、配列のオブジェクトには、特別の処理が必要です。他のオブジェクトをストリームに保管したり、そこから取り出したりするには、それらのオブジェクトにSerializable
かExternalizable
インタフェースが実装されていなければなりません。プリミティブデータ型は、
DataOutput
インタフェースのメソッド (writeInt
、writeFloat
、writeUTF
など) でストリームに書き込まれます。個別のバイトと配列バイトは、OutputStream
のメソッドで書き込まれます。直列化可能フィールド以外のプリミティブデータはブロックデータレコードでストリームに書き込まれ、各レコードの前にはマーカとレコード内のバイト数の表示が入れられます。
ObjectOutputStream
を拡張すれば、ストリームのクラスに関する情報をカスタマイズしたり、直列化されるオブジェクトを置き換えることができます。詳細は、annotateClass
とreplaceObject
メソッドの説明を参照してください。