Object Streams

Revised: Mar./23rd/2002

Serializable インタフェースを実装するクラスから作られた、直列化可能なオブジェクトを入出力するストリームは、次のクラスをインスタンス化して作ります:

java.io.ObjectOutputStream

オブジェクトを出力ストリームに書き込みます。ファイルに書き込むことでアプリケーションを終了した後でも持続的にオブジェクトを利用できます。ネットワーキングでソケットストリームを使うことで、リモートホストや他のプロセス上でオブジェクトをシェアすることも出来ます。

継承階層:

java.lang.Object
  |
  +--java.io.OutputStream
        |
        +--java.io.ObjectOutputStream

コンストラクタ:

protected  ObjectOutputStream()
           ObjectOutputStream(OutputStream out)

実装インタフェース:

DataOutput, ObjectOutput, ObjectStreamConstants

実際に書き込まれるのは、当該オブジェクトを再構築するのに必要な情報です。デフォルトで書き込まれるのは次の情報です:

フィールドで他のオブジェクトが参照されていれば、これも書き込まれます。

読み込んで再構築するには、次に紹介する java.io.ObjectInputStream を使います。

java.io.ObjectInputStream

java.io.ObjectOutputStream で事前に直列化されたオブジェクトを元に戻すために使います。

ファイルストリームを用いたオブジェクトの持続的な保持や、ソケットストリームの使用による、ホスト間でのオブジェクトの受け渡しのために使えます。

継承階層:

java.lang.Object
  |
  +--java.io.InputStream
        |
        +--java.io.ObjectInputStream

コンストラクタ:

protected  ObjectInputStream()
           ObjectInputStream(InputStream in)

実装インタフェース:

DataInput, ObjectInput, ObjectStreamConstants

直列化

ファイルに直列化可能なオブジェクトを書き込むためには次のようなコードになります。

// 日付オブジェクトをファイルに書き込み
    FileOutputStream outFile = new FileOutputStream("tmp");
    ObjectOutput s = new ObjectOutputStream(outFile);

    s.writeObject("Today");
    s.writeObject(new Date());
    s.flush();

    s.close();
    outFile.close();

このストリームで直列化可能なオブジェクトは、デフォルトでは次のような条件のクラスから作られたものに限られます:

スーパークラスが直列化可能でない場合は、復元するときに引数のないコンストラクタが呼ばれて再構築されます。したがって、このスーパークラスが引数のないコンストラクタを実装していない場合は、サブクラスも直列化できません。

引数のないコンストラクタで構築されたスーパークラスを適切な状態に更新する為には、サブクラスで writeObject()/readObject() をオーバーライドして、直列化プロセスをカスタマイズする必要があります。

フィールドで直列化可能でないオブジェクトを参照している場合は、 transient 修飾子で直列化されないように明示しておく必要があります。この場合は復元されるときに 0/null で初期化されますので、適切な状態に更新する為には writeObject()/readObject() をオーバーライドして、直列化プロセスをカスタマイズする必要があります。

直列化復元

ファイルに書き込まれたオブジェクトを復元するには、次のようなコードになります:

// ファイルからオブジェクトを読み込んで復元
    FileInputStream inFile = new FileInputStream("tmp");
    ObjectInputStream s = new ObjectInputStream(inFile);

    String today = (String)s.readObject();
    Date date = (Date)s.readObject();

    s.close();
    inFile.close();

このとき、直列化可能でないスーパークラスは、引数のないコンストラクタが呼ばれて再構築されます。



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.