[目次] [前項目] [次項目]

オブジェクト出力インタフェース


トピック:

ObjectOutputStreamクラス

クラス 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 メソッドは、オブジェクトをストリームに直列化するために使用します。オブジェクトは、次のように直列化されます。

  1. ブロックデータバッファにデータがあれば、それがストリームに書き込まれ、バッファがリセットされます。
  2. オブジェクトが null なら、null がストリームに置かれ、writeObject から戻ります。
  3. オブジェクトがストリームにすでに書き込まれていれば、そのハンドルがストリームに書き込まれ、writeObject から戻ります。そのオブジェクトがすでに置き換えられていれば、前に書き込まれた置換オブジェクトのハンドルがストリームに書き込まれます。
  4. オブジェクトがクラスなら、対応する ObjectStreamClass がストリームに書き込まれ、そのクラスのハンドルが割り当てられ、writeObject から戻ります。
  5. オブジェクトが ObjectStreamClass なら、そのクラスの記述子がストリームに書き込まれます。これには、その名前、serialVersionUID、名前と型別のフィールド・リストが含まれます。この記述子のハンドルが割り当てられます。writeObject から戻る前に、annotateClass サブクラスメソッドが呼び出されます。
  6. オブジェクトが java.lang.String なら、その文字列が Universal Transfer Format (UTF) 形式で書き込まれ、ハンドルがその文字列に割り当てられ、writeObject から戻ります。
  7. オブジェクトが配列なら、その配列の ObjectStreamClass を書き込むために、writeObject が再帰的に呼び出されます。その配列のハンドルが割り当てられます。このハンドルの後には、配列の長さが続きます。次に、配列の各要素がストリームに書き込まれ、その後 writeObject から戻ります。
  8. enableReplaceObject を呼び出すことによってオンにされていれば、replaceObject メソッドが呼び出され、サブクラスによるオブジェクトの置換が可能になります。オブジェクトが置き換えられると、元のオブジェクトから置換オブジェクトへのマッピングがステップ 3 で後に使用するために格納され、新しいオブジェクトに対してステップ 2 から 7 が繰り返されます。置換オブジェクトがステップ 2 から 7 で処理される型の 1 つでないと、その置換オブジェクトを使った処理がステップ 9 から再開されます。
  9. 正規オブジェクトの場合は、そのオブジェクトのクラスに対する ObjectStreamClass が、再帰的に呼び出される writeObject によって書き込まれます。これは、初めて参照されたときだけストリームに現れます。このオブジェクトのハンドルが割り当てられます。
  10. オブジェクトの内容がストリームに書き込まれます。
トラバーサルの間、または基本のストリームで例外が起こることがあります。 ObjectStreamException のいずれのサブクラスでも、例外は例外プロトコルを使ってストリームに書き込まれ、ストリーム状態は破棄されます。他の例外では、ストリームは打ち切られ、不明で使用不能な状態のままになります。

defaultWriteObject メソッドは、現行クラスのデフォルトの直列化メカニズムを実装するためのものです。このメソッドは、クラスの writeObject メソッドからのみ呼び出すことができます。このメソッドは、現行クラスのすべての nonstatic と nontransient のフィールドをストリームに書き込みます。writeObject 以外から呼び出すと、NotActiveException がスローされます。

resetメソッドは、ストリーム状態を、構築されたばかりの状態にリセットします。リセットによって、ストリームにすでに書き込まれたオブジェクトの状態は破棄されます。ストリームの現行ポイントがリセットと記されるので、対応する ObjectInputStream が同じポイントでリセットされます。ストリームに前に書き込まれたオブジェクトは、そのストリームにすでに書き込まれているものとはみなされません。それらのオブジェクトは、ストリームに再び書き込まれます。このことは、1 つまたは複数のオブジェクトの内容を再び送る必要がある場合には便利です。オブジェクトが直列化されている間は、オブジェクトを呼び出すことはできません。誤った呼び出しを行うと、IOException がスローされます。

annotateClass メソッドは、クラスが直列化されつつある間と、クラス記述子がストリームに書き込まれた後に呼び出されます。サブクラスによってこのメソッドを拡張し、そのクラスに関する他の情報をストリームに書き込むことができます。この情報は、対応する ObjectInputStream サブクラスの resolveClass メソッドで読み込まなければなりません。

replaceObject メソッドは信頼されたサブクラスによって使用されるもので、これによりグラフ内のオブジェクトが直列化の際に置き換えまたはモニタされます。オブジェクトの置換は、置き換える最初のオブジェクトで writeObject を呼び出す前に、enableReplaceObject を明示的に呼び出すことによってオンにされなければなりません。これがオンにされると、各オブジェクトに対して、それが初めて直列化される直前に replaceObject が呼び出されます。サブクラスの実装によっては、元のオブジェクトの代わりに、直列化される置換オブジェクトが返されることがあります。この置換オブジェクトは直列化可能でなければなりません。ストリームにおける元のオブジェクトへのすべての参照は、この置換オブジェクトによって置き換えられます。

このサブクラスでは、置換される際、オブジェクトは参照が格納されるすべてのフィールドと互換性がなければなりません。または、直列化復元で補足的な置換が行われなければなりません。オブジェクトは、そのタイプがフィールドまたは配列要素の型のサブクラスでないと、後で、ClassCastException を上げることによって直列化復元を打切ります。参照は格納されません。

enableReplaceObject メソッドは ObjectOutputStream の信頼されたサブクラスによって使用されるもので、これにより直列化の際に、あるオブジェクトで別のオブジェクトを置き換えることが可能になります。オブジェクトの置換は、enableReplaceObjecttrue 値で呼び出されるまで使用できません。オブジェクトの置換は、その後、この値を false に設定すれば使用不能になります。前の設定が返されます。enableReplaceObject メソッドは、置換を求めているそのストリームが信頼されているかどうかを調べます。オブジェクトへのすべての参照が replaceObject へ渡されます。オブジェクトの private 状態が意図せずに壊される危険のないように、信頼されたストリームしか replaceObject を使用することはできません。信頼されたクラスとは、クラスローダが null に等しいクラスです。

writeStreamHeader メソッドは、マジック番号とバージョンをストリームに書き込みます。この情報は、ObjectInputStreamreadStreamHeader メソッドで読み込まなければなりません。サブクラスは、ストリームの固有形式を識別するためにこのメソッドを実装しなければならない場合があります。

flush メソッドは、ストリームによって保持されているバッファを空にし、このフラッシュを基本ストリームに転送するために使用します。基本のストリームをフラッシュせずに ObjectOutputStream のバッファだけを空にする場合は、サブクラスによって drain メソッドを使用することができます。

プリミティブ型に対するすべての write メソッドは、DataOutputStream を使ってそれらを標準ストリーム形式に置くことによって、それらの値をコード化します。それらのバイトはブロックデータレコードにバッファされるので、オブジェクトのコード化とは区別できます。このバッファリングによって、プリミティブデータは、クラスのバージョン化のために必要ならスキップされます。さらに、このバッファリングによって、ストリームは、クラス固有のメソッドを呼び出すことなく解析されます。

writeObject メソッド

Serializable オブジェクトの場合、writeObject メソッドによって、クラスがそれ自身のフィールドの直列化を制御することができます。次はそのシグネチャです。

	private void writeObject(ObjectOutputStream stream)
		throws IOException;
Serializable オブジェクトの各サブクラスは、それ自身の writeObject メソッドを定義することができます。クラスにこのメソッドが実装されていなければ、defaultWriteObject によって与えられるデフォルトの直列化が使用されます。実装されていれば、そのクラスは、それ自身のフィールドの保管だけに責任があります。そのスーパー型やサブ型のフィールドの責任はありません。

クラスの writeObject メソッドは、実装されているなら、そのクラスの状態を保管する責任があります。defaultWriteObject メソッドをまず呼び出してからでないと、対応する readObjectによって、そのオブジェクトの状態を復元するために必要になる任意指定のデータを書き込むことはできません。この任意指定データの形式、構造体、バージョン化の責任はすべて、そのクラスにあります。

writeExternalメソッド

java.io.Externalizable を実装するオブジェクトは、writeExternal メソッドを実装して、そのオブジェクトの状態全体を保管する必要があります。このオブジェクトは、そのスーパークラスと協調して、それらの状態を保管しなければなりません。ObjectOutput のすべてのメソッドが、オブジェクトのプリミティブ型フィールドとオブジェクトフィールドを保管するために使用できます。

	public void writeExternal(ObjectOutput stream)
		throws IOException;


[目次] [前項目] [次項目]

Copyright (C) 1996, 1997 Sun Microsystems, Inc. All rights reserved.