Revised: Mar./23rd/2002
Serializable インタフェースを実装するクラスから作られた、直列化可能なオブジェクトを入出力するストリームは、次のクラスをインスタンス化して作ります:
java.io.ObjectOutputStreamjava.io.ObjectInputStreamjava.io.ObjectOutputStreamオブジェクトを出力ストリームに書き込みます。ファイルに書き込むことでアプリケーションを終了した後でも持続的にオブジェクトを利用できます。ネットワーキングでソケットストリームを使うことで、リモートホストや他のプロセス上でオブジェクトをシェアすることも出来ます。
継承階層:
java.lang.Object
|
+--java.io.OutputStream
|
+--java.io.ObjectOutputStream
コンストラクタ:
protected ObjectOutputStream()
ObjectOutputStream(OutputStream out)
実装インタフェース:
DataOutput, ObjectOutput, ObjectStreamConstants
実際に書き込まれるのは、当該オブジェクトを再構築するのに必要な情報です。デフォルトで書き込まれるのは次の情報です:
transientかつ非staticメンバーの持つ値フィールドで他のオブジェクトが参照されていれば、これも書き込まれます。
読み込んで再構築するには、次に紹介する java.io.ObjectInputStream を使います。
java.io.ObjectInputStreamjava.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();
このストリームで直列化可能なオブジェクトは、デフォルトでは次のような条件のクラスから作られたものに限られます:
Serializable か Externalizable インタフェースを実装しているスーパークラスが直列化可能でない場合は、復元するときに引数のないコンストラクタが呼ばれて再構築されます。したがって、このスーパークラスが引数のないコンストラクタを実装していない場合は、サブクラスも直列化できません。
引数のないコンストラクタで構築されたスーパークラスを適切な状態に更新する為には、サブクラスで 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();
このとき、直列化可能でないスーパークラスは、引数のないコンストラクタが呼ばれて再構築されます。