目次 | 前の項目 | 次の項目 Java オブジェクト直列化仕様


1.2 オブジェクトストリームへの書き込み

オブジェクトやプリミティブをストリームに書き込むことは、複雑な処理ではありません。例を示します。

// 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 メソッド」を参照) は、指定されたオブジェクトを直列化し、オブジェクトグラフ内の指定オブジェクトから他のオブジェクトへの参照を再帰的に移動して、そのグラフの完全に直列化した表現を作成します。ストリーム内でオブジェクトに対する初めての参照があると、そのオブジェクトが直列化または外部化され、そのオブジェクトのハンドルが割り当てられます。そのオブジェクトに対するそれ以後の参照は、そのハンドルとしてコード化されます。オブジェクトハンドルを使用すれば、オブジェクトにおいて当然起こる共用参照や循環参照が保存されます。オブジェクトのそれ以後の参照ではそのハンドルだけを使用するため、非常に簡潔な表現が可能になります。

型が ClassObjectStreamClassString、配列のオブジェクトには、特別の処理が必要です。他のオブジェクトをストリームに保管したり、そこから取り出したりするには、それらのオブジェクトに SerializableExternalizable インタフェースが実装されていなければなりません。

プリミティブデータ型は、DataOutput インタフェースのメソッド (writeIntwriteFloatwriteUTF など) でストリームに書き込まれます。個別のバイトと配列バイトは、OutputStream のメソッドで書き込まれます。直列化可能フィールド以外のプリミティブデータはブロックデータレコードでストリームに書き込まれ、各レコードの前にはマーカとレコード内のバイト数の表示が入れられます。

ObjectOutputStream を拡張すれば、ストリームのクラスに関する情報をカスタマイズしたり、直列化されるオブジェクトを置き換えることができます。詳細は、annotateClassreplaceObject メソッドの説明を参照してください。



目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.