ObjectOutputStream は、オブジェクト直列化を実装するためのものです。このクラスは、すでに直列化されたオブジェクト・セットなどのストリームの状態を維持します。そのメソッドは、直列化するオブジェクトのトラバーサルを制御して、指定されたオブジェクトと参照するオブジェクトを保管します。
package java.io;
public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
{
public ObjectOutputStream(OutputStream out)
throws IOException;
public final void writeObject(Object obj)
throws IOException;
public final void defaultWriteObject();
throws IOException, NotActiveException;
public void reset() throws IOException;
protected void annotateClass(Class cl) throws IOException;
protected Object replaceObject(Object obj) throws IOException;
protected final boolean enableReplaceObject(boolean enable)
throws SecurityException;
protected void writeStreamHeader() throws IOException;
public void write(int data) throws IOException;
public void write(byte b[]) throws IOException;
public void write(byte b[], int off, int len) throws IOException;
public void flush() throws IOException;
protected void drain() throws IOException;
public void close() throws IOException;
public void writeBoolean(boolean data) throws IOException;
public void writeByte(int data) throws IOException;
public void writeShort(int data) throws IOException;
public void writeChar(int data) throws IOException;
public void writeInt(int data) throws IOException;
public void writeLong(long data) throws IOException;
public void writeFloat(float data) throws IOException;
public void writeDouble(double data) throws IOException;
public void writeBytes(String data) throws IOException;
public void writeChars(String data) throws IOException;
public void writeUTF(String data) throws IOException;
}
ObjectOutputStream 構築子には、OutputStream が必要です。この構築子は、writeStreamHeader を呼び出して、マジック番号とバージョンをストリームに書き込みます。そして、このストリームは、ObjectInputStream 構築子の対応する readStreamHeader によって読み込まれ、検査されます。
writeObject メソッドは、オブジェクトをストリームに直列化するために使用します。オブジェクトは、次のように直列化されます。
writeObject から戻る前に、annotateClass サブクラスメソッドが呼び出されます。
java.lang.String なら、その文字列が Universal Transfer Format (UTF) 形式で書き込まれ、ハンドルがその文字列に割り当てられ、writeObject から戻ります。
ObjectStreamClass を書き込むために、writeObject が再帰的に呼び出されます。その配列のハンドルが割り当てられます。このハンドルの後には、配列の長さが続きます。次に、配列の各要素がストリームに書き込まれ、その後 writeObject から戻ります。
enableReplaceObject を呼び出すことによってオンにされていれば、replaceObject メソッドが呼び出され、サブクラスによるオブジェクトの置換が可能になります。オブジェクトが置き換えられると、元のオブジェクトから置換オブジェクトへのマッピングがステップ 3 で後に使用するために格納され、新しいオブジェクトに対してステップ 2 から 7 が繰り返されます。置換オブジェクトがステップ 2 から 7 で処理される型の 1 つでないと、その置換オブジェクトを使った処理がステップ 9 から再開されます。
writeObject メソッドがない場合は、defaultWriteObject メソッドが呼び出され、nonstatic と nontransient なフィールドがストリームに書き込まれます。そのクラスに writeObject メソッドがあれば、それが呼び出されます。このクラスは、defaultWriteObject を呼び出して、オブジェクトの状態を保管してから、他の情報をストリームに書き込むことができます。
Externalizable なら、そのオブジェクトの writeExternal メソッドが呼び出されます。
ObjectStreamException のいずれのサブクラスでも、例外は例外プロトコルを使ってストリームに書き込まれ、ストリーム状態は破棄されます。他の例外では、ストリームは打ち切られ、不明で使用不能な状態のままになります。
defaultWriteObject メソッドは、現行クラスのデフォルトの直列化メカニズムを実装するためのものです。このメソッドは、クラスの writeObject メソッドからのみ呼び出すことができます。このメソッドは、現行クラスのすべての nonstatic と nontransient のフィールドをストリームに書き込みます。writeObject 以外から呼び出すと、NotActiveException がスローされます。
resetメソッドは、ストリーム状態を、構築されたばかりの状態にリセットします。リセットによって、ストリームにすでに書き込まれたオブジェクトの状態は破棄されます。ストリームの現行ポイントがリセットと記されるので、対応する ObjectInputStream が同じポイントでリセットされます。ストリームに前に書き込まれたオブジェクトは、そのストリームにすでに書き込まれているものとはみなされません。それらのオブジェクトは、ストリームに再び書き込まれます。このことは、1 つまたは複数のオブジェクトの内容を再び送る必要がある場合には便利です。オブジェクトが直列化されている間は、オブジェクトを呼び出すことはできません。誤った呼び出しを行うと、IOException がスローされます。
annotateClass メソッドは、クラスが直列化されつつある間と、クラス記述子がストリームに書き込まれた後に呼び出されます。サブクラスによってこのメソッドを拡張し、そのクラスに関する他の情報をストリームに書き込むことができます。この情報は、対応する ObjectInputStream サブクラスの resolveClass メソッドで読み込まなければなりません。
replaceObject メソッドは信頼されたサブクラスによって使用されるもので、これによりグラフ内のオブジェクトが直列化の際に置き換えまたはモニタされます。オブジェクトの置換は、置き換える最初のオブジェクトで writeObject を呼び出す前に、enableReplaceObject を明示的に呼び出すことによってオンにされなければなりません。これがオンにされると、各オブジェクトに対して、それが初めて直列化される直前に replaceObject が呼び出されます。サブクラスの実装によっては、元のオブジェクトの代わりに、直列化される置換オブジェクトが返されることがあります。この置換オブジェクトは直列化可能でなければなりません。ストリームにおける元のオブジェクトへのすべての参照は、この置換オブジェクトによって置き換えられます。
このサブクラスでは、置換される際、オブジェクトは参照が格納されるすべてのフィールドと互換性がなければなりません。または、直列化復元で補足的な置換が行われなければなりません。オブジェクトは、そのタイプがフィールドまたは配列要素の型のサブクラスでないと、後で、ClassCastException を上げることによって直列化復元を打切ります。参照は格納されません。
enableReplaceObject メソッドは ObjectOutputStream の信頼されたサブクラスによって使用されるもので、これにより直列化の際に、あるオブジェクトで別のオブジェクトを置き換えることが可能になります。オブジェクトの置換は、enableReplaceObject が true 値で呼び出されるまで使用できません。オブジェクトの置換は、その後、この値を false に設定すれば使用不能になります。前の設定が返されます。enableReplaceObject メソッドは、置換を求めているそのストリームが信頼されているかどうかを調べます。オブジェクトへのすべての参照が replaceObject へ渡されます。オブジェクトの private 状態が意図せずに壊される危険のないように、信頼されたストリームしか replaceObject を使用することはできません。信頼されたクラスとは、クラスローダが null に等しいクラスです。
writeStreamHeader メソッドは、マジック番号とバージョンをストリームに書き込みます。この情報は、ObjectInputStream の readStreamHeader メソッドで読み込まなければなりません。サブクラスは、ストリームの固有形式を識別するためにこのメソッドを実装しなければならない場合があります。
flush メソッドは、ストリームによって保持されているバッファを空にし、このフラッシュを基本ストリームに転送するために使用します。基本のストリームをフラッシュせずに ObjectOutputStream のバッファだけを空にする場合は、サブクラスによって drain メソッドを使用することができます。
プリミティブ型に対するすべての write メソッドは、DataOutputStream を使ってそれらを標準ストリーム形式に置くことによって、それらの値をコード化します。それらのバイトはブロックデータレコードにバッファされるので、オブジェクトのコード化とは区別できます。このバッファリングによって、プリミティブデータは、クラスのバージョン化のために必要ならスキップされます。さらに、このバッファリングによって、ストリームは、クラス固有のメソッドを呼び出すことなく解析されます。
writeObject メソッドによって、クラスがそれ自身のフィールドの直列化を制御することができます。次はそのシグネチャです。
private void writeObject(ObjectOutputStream stream) throws IOException;
クラスの writeObject メソッドは、実装されているなら、そのクラスの状態を保管する責任があります。defaultWriteObject メソッドをまず呼び出してからでないと、対応する readObjectによって、そのオブジェクトの状態を復元するために必要になる任意指定のデータを書き込むことはできません。この任意指定データの形式、構造体、バージョン化の責任はすべて、そのクラスにあります。
java.io.Externalizable を実装するオブジェクトは、writeExternal メソッドを実装して、そのオブジェクトの状態全体を保管する必要があります。このオブジェクトは、そのスーパークラスと協調して、それらの状態を保管しなければなりません。ObjectOutput のすべてのメソッドが、オブジェクトのプリミティブ型フィールドとオブジェクトフィールドを保管するために使用できます。
public void writeExternal(ObjectOutput stream) throws IOException;