全パッケージ  クラス階層  このパッケージ  前パッケージ  次項目  インデックス

クラス java.io.ObjectOutputStream

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

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
ObjectOutputStream は Java のプリミティブデータ型とグラフを OutputStream へ書き込みます。 これらのオブジェクトを読む(再構成する)ときは ObjectInputStream を使います。 オブジェクトの長期保存はそのストリームのためのファイルを使えば可能です。 ストリームがネットワークソケットストリームであるならば、他のホストや他のプロセス上でオブジェクトを再構成することもできます。

ストリームに書き込めるのは java.io.Serializable インタフェースをサポートするオブジェクトのみです。 各直列化可能オブジェクトのクラスは、クラスの名前とシグネチャ、オブジェクトのフィールドと配列、そして初期オブジェクトから参照される他の全てのオブジェクトのクロージャを含めてエンコードされます。

オブジェクトをストリームへ書き込むときは writeObject メソッドを使います。Strings や配列を含む任意のオブジェクトが writeObject により書き込まれます。 多重オブジェクトとかプリミティブもストリームへの書き込みが可能です。 オブジェクトを読み込むときは対応する ObjectInputstream によって同じ型として、かつ書き込まれたときと同じ順序で読み込まなければなりません。

プリミティブデータ型をストリームに書き込む場合は、DataOutput の適切なメソッドを使います。Strings を書き込む場合には writeUTF メソッドを使います。

オブジェクトに対する直列化メカニズムはデフォルト条件では、クラスのオブジェクト、クラスのシグネチャ、そして全ての non-transient、non-static フィールドの持つ値を書き込みます。 他のオブジェクトへの参照(transient と static フィールドは除いて)があれば、これらのオブジェクトもやはり書き込まれます。単一オブジェクトへの多重参照は参照共有メカニズムによりエンコードされ、オブジェクトのグラフをオリジナルが書き込まれたときの形状に再構成することができます。

一例として、ObjectInputStream の例題を使って読み込めるようにオブジェクトを書き込む方法は次のようになります。

	FileOutputStream ostream = new FileOutputStream("t.tmp");
	ObjectOutputStream p = new ObjectOutputStream(ostream);
	p.writeInt(12345);
	p.writeObject("Today");
	p.writeObject(new Date());
	p.flush();
	ostream.close();
 
直列化と直列化復元のプロセスで特別な取り扱いを必要とするクラスは厳密なシグネチャを持った特別なクラスを実装しなければなりません。

 private void readObject(java.io.ObjectInputStream stream)
     throws IOException, ClassNotFoundException; 
 private void writeObject(java.io.ObjectOutputStream stream)
     throws IOException
 

オブジェクトの属する特定のクラスに則してオブジェクトの状態を、対応する readObject メソッドを使って再生できるように書き込むのは writeObject メソッドの責任です。 このメソッドは、オブジェクトのスーパークラスとサブクラスに属する状態に関与する必要はありません。 個々のフィールドを writeObject メソッドを使ってObjectOutputStream へ書き込むか、または DataOutput がサポートするプリミティブデータ型用のメソッドを使えば、 状態が保存されます。

オブジェクトが java.io.Serializable インタフェースを実装していない場合は、直列化はフィールドを書き込みません。 直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。 この場合、直列化可能ではないクラスは引数を取らない構築子を含まねばならず、それを使ってフィールドを初期化しなければなりません。 この場合、直列化可能でないクラスの状態を保存し、再構成するのはサブクラスの責任になります。しばしば起こるケースは、そのクラスのフィールドがアクセス可能(public、package、または protected)であるか、または状態を再構成するために使える get と set メソッドが存在する場合です。

writeObject と readObject メソッドで NotSerializableException をスローするように実装しておくとオブジェクトの直列化を防止できます。 この例外が発生すると ObjectOutputStream がトラップして直列化プロセスを停止させます。 直列化が起こったときのオブジェクトの内容と形式をオブジェクト側で完全にコントロールするには、Externalizable インタフェースを実装します。 Externalizable インタフェースの writeExternal と readExternal メソッドが呼び出されてオブジェクトの状態の保存と再生を行います。 クラスにより実装された場合には、ObjectOutput とObjectInput の全てのメソッドを使ってそれら自身の状態の書き込みと読み込みを行います。 どのようなバージョンであっても同じような取り扱いができるようにするのはオブジェクトの責任です。

参照:
DataOutput, ObjectInputStream, Serializable, Externalizable

Constructor Index

 o ObjectOutputStream(OutputStream)
指定された OutputStream へ書き込む ObjectOutputStream を作成する。

Method Index

 o annotateClass(Class)
サブクラスは、クラスのデータをストリームに保存できるようにこのメソッドを実装してもよい。
 o close()
ストリームをクローズする。
 o defaultWriteObject()
現在のクラスの non-static と non-transient フィールドをストリームに書き込む。
 o drain()
ObjectOutputStream にあるバッファデータを全部空にしる。
 o enableReplaceObject(boolean)
ストリーム中のオブジェクトを交換できるようにストリームを設定する。
 o flush()
ストリームをフラッシュする。
 o replaceObject(Object)
このメソッドは直列化の過程で ObjectOutputStream の信頼できるサブクラスが1つのオブジェクトを他のオブジェクトに代入できるようにする。
 o reset()
ストリームにすでに書き込まれているオブジェクトの状態を無効にしてリセットする。
 o write(byte[])
バイト配列を書き込む。
 o write(byte[], int, int)
バイトのサブ配列を書き込む。
 o write(int)
1個のバイトを書き込む。
 o writeBoolean(boolean)
1個の boolean を書き込む。
 o writeByte(int)
1個の 8-bit バイトを書き込む。
 o writeBytes(String)
String をバイトの列として書き込む。
 o writeChar(int)
1個の 16-bit char を書き込む。
 o writeChars(String)
String を char の列として書き込む。
 o writeDouble(double)
1個の 64-bit double を書き込む。
 o writeFloat(float)
1個の 32 bit float を書き込む。
 o writeInt(int)
1個の 32 bit int を書き込む。
 o writeLong(long)
1個の 64 bit long を書き込む。
 o writeObject(Object)
指定されたオブジェクトを ObjectOutputStream へ書き込む。
 o writeShort(int)
1個の 16 bit short を書き込む。
 o writeStreamHeader()
サブクラスが自分のヘッダーをストリームにアペンドまたはプリペンドできるように writeStreamHeader が提供される。
 o writeUTF(String)
String を UTF 形式で書き込む。

Constructors

 o ObjectOutputStream
 public ObjectOutputStream(OutputStream out) throws IOException
指定された OutputStream へ書き込む ObjectOutputStream を作成します。 ストリームへストリームヘッダーが書き込まれます。場合によっては、呼び出し側は対応するObjectInputStream が直ちにヘッダーを読み込めるように flush を呼び出すことがあります。

例外: IOException
下層の OutputStream により何らかの例外が発生した場合。

Methods

 o 
writeObject
 public final void writeObject(Object obj) throws IOException
指定されたオブジェクトを ObjectOutputStream へ書き込みます。 オブジェクトのクラス、クラスのシグネチャ、クラスの non-transient と non-static フィールド、および全部のスーパークラスが書き込まれます。クラスのデフォルトの直列化は writeObject と readObject メソッドを使ってオーバーライドすることが出来ます。このオブジェクトが参照するオブジェクトも暫定的に書き込まれ、ObjectInputStream によって完全に同等なオブジェクトグラフを再構成することが可能です。

OutputStream に関する問題と直列化してはいけないクラスが発生すると例外がスローされます。ここで例外が発生すると OutputStream が状態不定で残されるため致命的なエラーになります。ストリームの状態を無視するか、回復処理するかは呼び出し側で判断しなければなりません。

例外: InvalidClassExcesption
直列化で使用するクラスに問題が生じた場合。
例外: NotSerializableException
直列化の対象が java.io.Serializable インタフェースを実装していない場合。
例外: IOException
下層の OutputStream により何らかの例外が発生した場合。
 o defaultWriteObject
 public final void defaultWriteObject() throws IOException
現在のクラスの non-static と non-transient フィールドをストリームに書き込みます。このメソッドを呼ぶことができるのは現在直列化が行われているクラスの writeObject メソッドだけです。他の方法で呼び出された場合、NotActiveException がスローされます。

 o reset
 public void reset() throws IOException
ストリームにすでに書き込まれているオブジェクトの状態を無効にしてリセットします。状態は ObjectOutputStream の新規作成時と同じにリセットされます。ストリームの現在位置にマークが付けられ、対応する ObjectInputStream も同じ位置にリセットされます。それ以前にストリームに書き込まれていたオブジェクトはストリーム上にあるとはみなされず、再度ストリームに書き込まれます。

 o 
annotateClass
 protected void annotateClass(Class cl) throws IOException
サブクラスは、クラスのデータをストリームに保存できるようにこのメソッドを実装する場合があります。デフォルトではこのメソッドは何の操作も行いません。 ObjectInputStream の対応するメソッドは resolveClass です。 このメソッドはストリーム上の一意のクラスからただ1回だけ呼び出されます。 その時点でクラス名とシグネチャはすでにストリームに書き込まれています。このメソッドは ObjectOutputStream を自由に使って適当と判断されるならばクラスの任意の表現(例えば、クラスファイル)を保存できます。 ObjectInputStream の対応するサブクラスの resolveClass メソッドは、annotateClass によって書き込まれたデータを読み込み、使用しなければなりません。

例外: IOException
下層の OutputStream により何らかの例外が発生した場合。
 o 
replaceObject
 protected Object replaceObject(Object obj) throws IOException
このメソッドは直列化の過程で ObjectOutputStream の信頼できるサブクラスが1つのオブジェクトを他のオブジェクトに代入できるようにします。 オブジェクトを交換することは enableReplaceObject が呼び出されるまでは禁止状態にあります。 enableReplaceObject メソッドは交換を要求しているストリームが信頼できるかをチェックします。 直列化可能オブジェクトへの参照はすべて replaceObject へ渡されます。オブジェクトの private 変数の状態が不用意に外部に晒されるのを防ぐために、replaceObject を使えるのは信頼できるストリームのみに限定されます。

サブクラスがオブジェクトの交換を行うときは、直列化復元実行時に相補的に代入が行われるか、または代入されたオブジェクトが参照が保存される全てのフィールドについて互換性を持つことが保証されなければなりません。オブジェクトのタイプがこの要請を満たすフィールドと配列要素を持ったサブクラスではない場合には、例外がスローされて直列化は中断となり、その結果オブジェクトは保存されません。

このメソッドが呼ばれるのは各オブジェクトが最初に現れたとき1回のみです。これ以後現れるそのオブジェクトへの参照は新しいオブジェクトへリダイレクトされます。 このメソッドは代入されるべきメソッドか、またはオリジナルかのいずれかを返さなければなりません。

代入されるオブジェクトとして null を返すこともできますが、オリジナルオブジェクトへの参照を含むクラスでは、null ではなくオブジェクトが返されることを仮定しているものがあり、この場合は NullReferenceException がスローされます。

例外: IOException
下層の OutputStream により何らかの例外が発生した場合。
 o 
enableReplaceObject
 protected final boolean enableReplaceObject(boolean enable) throws SecurityException
ストリーム中のオブジェクトを交換できるようにストリームを設定します。 ストリームが信頼できるクラスであれば、交換できるように設定することが可能です。 信頼できるクラスとは classLoader が null であるクラスのことです。

もし、可能に設定されると、あらゆるオブジェクトが直列化されているときに replaceObject メソッドが呼び出されます。

例外: SecurityException
ストリームの classloader が null ではない場合。
 o writeStreamHeader
 protected void writeStreamHeader() throws IOException
サブクラスが自分のヘッダーをストリームにアペンドまたはプリペンドできるように writeStreamHeader が提供されます。 このメソッドはマジックナンバーとバージョン情報をストリームへ書き込みます。

 o write
 public void write(int data) throws IOException
1個のバイトを書き込みます。このメソッドはデータが実際に書き込まれるまでブロックします。

パラメータ:
b - バイトデータ。
例外: IOException
I/O エラーが発生した場合。
オーバーライド:
クラス OutputStreamwrite
 o write
 public void write(byte b[]) throws IOException
バイト配列を書き込みます。このメソッドは実際にデータが書き込まれるまでブロックします。

パラメータ:
b - 書き込まれるデータ。
例外: IOException
I/O エラーが発生した場合。
オーバーライド:
クラス OutputStreamwrite
 o write
 public void write(byte b[],
                   int off,
                   int len) throws IOException
バイトのサブ配列を書き込みます。

パラメータ:
b - 書き込むデータ。
off - データの開始位置を示すオフセット。
len - 書き込むバイト数。
例外: IOException
I/O エラーが発生した場合。
オーバーライド:
クラス OutputStreamwrite
 o flush
 public void flush() throws IOException
ストリームをフラッシュします。このメソッドはバッファリングされている全ての出力バイトを書き込んで、下層ストリームを通してフラッシュします。

例外: IOException
I/O エラーが発生した場合。
オーバーライド:
クラス OutputStreamflush
 o drain
 protected void drain() throws IOException
ObjectOutputStream にあるバッファデータを全部空にします。flush と似た動作ですが、このメソッドでは下層ストリームの flush は起こりません。

 o close
 public void close() throws IOException
ストリームをクローズします。ストリームに関連したリソースを解放するにはこのメソッドを呼び出さなければいけません。

例外: IOException
I/O エラーが発生した場合。
オーバーライド:
クラス OutputStreamclose
 o writeBoolean
 public void writeBoolean(boolean data) throws IOException
1個の boolean を書き込みます。

パラメータ:
v - 書き込む boolean 。
 o writeByte
 public void writeByte(int data) throws IOException
1個の 8 bit バイトを書き込みます。

パラメータ:
v - 書き込むバイト値。
 o writeShort
 public void writeShort(int data) throws IOException
1個の 16-bit short を書き込みます。

パラメータ:
v - 書き込む short 値。
 o writeChar
 public void writeChar(int data) throws IOException
1個の 16-bit char を書き込みます。

パラメータ:
v - 書き込む char 値。
 o writeInt
 public void writeInt(int data) throws IOException
1個の 32-bit int を書き込みます。

パラメータ:
v - 書き込む integer 値。
 o writeLong
 public void writeLong(long data) throws IOException
1個の 64-bit long を書き込みます。

パラメータ:
v - 書き込む long 値。
 o writeFloat
 public void writeFloat(float data) throws IOException
1個の 32-bit float を書き込みます。

パラメータ:
v - 書き込む float 値。
 o writeDouble
 public void writeDouble(double data) throws IOException
1個の 64-bit double を書き込みます。

パラメータ:
v - 書き込む double 値。
 o 
writeBytes
 public void writeBytes(String data) throws IOException
String をバイトの列として書き込みます

パラメータ:
s - 書き込むバイトの String 。
 o 
writeChars
 public void writeChars(String data) throws IOException
String を chars の列として書き込みます。

パラメータ:
s - 書き込む char の String 。
 o writeUTF
 public void writeUTF(String data) throws IOException
UTF 形式で String を書き込みます。

パラメータ:
str - UTF 形式の String 。

全パッケージ  クラス階層  このパッケージ  前パッケージ  次項目  インデックス