全パッケージ クラス階層 このパッケージ 前パッケージ 次項目 インデックス
java.lang.Object
   |
   +----java.io.OutputStream
           |
           +----java.io.ObjectOutputStream
ストリームに書き込めるのは 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 の全てのメソッドを使ってそれら自身の状態の書き込みと読み込みを行います。 どのようなバージョンであっても同じような取り扱いができるようにするのはオブジェクトの責任です。
 
 ObjectOutputStream(OutputStream)
	ObjectOutputStream(OutputStream)
   
 annotateClass(Class)
	annotateClass(Class)
   close()
	close()
   defaultWriteObject()
	defaultWriteObject()
   drain()
	drain()
   enableReplaceObject(boolean)
	enableReplaceObject(boolean)
   flush()
	flush()
   replaceObject(Object)
	replaceObject(Object)
   reset()
	reset()
   write(byte[])
	write(byte[])
   write(byte[], int, int)
	write(byte[], int, int)
   write(int)
	write(int)
   writeBoolean(boolean)
	writeBoolean(boolean)
   writeByte(int)
	writeByte(int)
   writeBytes(String)
	writeBytes(String)
   writeChar(int)
	writeChar(int)
   writeChars(String)
	writeChars(String)
   writeDouble(double)
	writeDouble(double)
   writeFloat(float)
	writeFloat(float)
   writeInt(int)
	writeInt(int)
   writeLong(long)
	writeLong(long)
   writeObject(Object)
	writeObject(Object)
   writeShort(int)
	writeShort(int)
   writeStreamHeader()
	writeStreamHeader()
   writeUTF(String)
	writeUTF(String)
   
 ObjectOutputStream
ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException
 
 writeObject
writeObject
public final void writeObject(Object obj) throws IOException
OutputStream に関する問題と直列化してはいけないクラスが発生すると例外がスローされます。ここで例外が発生すると OutputStream が状態不定で残されるため致命的なエラーになります。ストリームの状態を無視するか、回復処理するかは呼び出し側で判断しなければなりません。
 defaultWriteObject
defaultWriteObject
public final void defaultWriteObject() throws IOException
 reset
reset
public void reset() throws IOException
 annotateClass
annotateClass
protected void annotateClass(Class cl) throws IOException
 replaceObject
replaceObject
protected Object replaceObject(Object obj) throws IOException
サブクラスがオブジェクトの交換を行うときは、直列化復元実行時に相補的に代入が行われるか、または代入されたオブジェクトが参照が保存される全てのフィールドについて互換性を持つことが保証されなければなりません。オブジェクトのタイプがこの要請を満たすフィールドと配列要素を持ったサブクラスではない場合には、例外がスローされて直列化は中断となり、その結果オブジェクトは保存されません。
このメソッドが呼ばれるのは各オブジェクトが最初に現れたとき1回のみです。これ以後現れるそのオブジェクトへの参照は新しいオブジェクトへリダイレクトされます。 このメソッドは代入されるべきメソッドか、またはオリジナルかのいずれかを返さなければなりません。
代入されるオブジェクトとして null を返すこともできますが、オリジナルオブジェクトへの参照を含むクラスでは、null ではなくオブジェクトが返されることを仮定しているものがあり、この場合は NullReferenceException がスローされます。
 enableReplaceObject
enableReplaceObject
protected final boolean enableReplaceObject(boolean enable) throws SecurityException
もし、可能に設定されると、あらゆるオブジェクトが直列化されているときに replaceObject メソッドが呼び出されます。
 writeStreamHeader
writeStreamHeader
protected void writeStreamHeader() throws IOException
 write
write
public void write(int data) throws IOException
 write
write
public void write(byte b[]) throws IOException
 write
write
 public void write(byte b[],
                   int off,
                   int len) throws IOException
 flush
flush
public void flush() throws IOException
 drain
drain
protected void drain() throws IOException
 close
close
public void close() throws IOException
 writeBoolean
writeBoolean
public void writeBoolean(boolean data) throws IOException
 writeByte
writeByte
public void writeByte(int data) throws IOException
 writeShort
writeShort
public void writeShort(int data) throws IOException
 writeChar
writeChar
public void writeChar(int data) throws IOException
 writeInt
writeInt
public void writeInt(int data) throws IOException
 writeLong
writeLong
public void writeLong(long data) throws IOException
 writeFloat
writeFloat
public void writeFloat(float data) throws IOException
 writeDouble
writeDouble
public void writeDouble(double data) throws IOException
 writeBytes
writeBytes
public void writeBytes(String data) throws IOException
 writeChars
writeChars
public void writeChars(String data) throws IOException
 writeUTF
writeUTF
public void writeUTF(String data) throws IOException
全パッケージ クラス階層 このパッケージ 前パッケージ 次項目 インデックス