|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.io.OutputStream | +--java.io.ObjectOutputStream
Java の基本データ型とオブジェクトグラフを OutputStream に書き込みます。これらのオブジェクトを読み込む (再構築する) には ObjectInputStream を使います。オブジェクトの持続的記憶は、そのストリームのためのファイルを使えば可能です。ストリームがネットワークソケットストリームの場合は、ほかのホストやほかのプロセス上でオブジェクトを再構築することもできます。
ストリームに書き込めるのは java.io.Serializable インタフェースをサポートするオブジェクトだけです。 各直列化可能オブジェクトのクラスは、クラスの名前とシグニチャー、オブジェクトのフィールドと配列、および初期オブジェクトから参照されるほかのすべてのオブジェクトのクロージャを含めてコード化されます。
オブジェクトをストリームに書き込むには writeObject メソッドを使います。String や配列を含む任意のオブジェクトが writeObject によって書き込まれます。複数のオブジェクトやプリミティブも、ストリームへの書き込みが可能です。オブジェクトを読み込むときは、対応する ObjectInputstream から同じ型として、かつ書き込まれたときと同じ順序で読み込まなければなりません。
基本データ型をストリームに書き込むには、DataOutput の適切なメソッドを使います。String を書き込む場合は writeUTF メソッドを使います。
オブジェクトのデフォルトの直列化機構は、クラスのオブジェクト、クラスのシグニチャー、およびすべての非 transient と非 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
writeObject メソッドは、対応する readObject がオブジェクトの状態を復元することができるように、オブジェクトの特定のクラスについて、オブジェクトの状態を書き込む責任があります。このメソッドは、オブジェクトのスーパークラスやサブクラスに属する状態に関与する必要はありません。状態を保存するには、個々のフィールドについて writeObject メソッドを使って ObjectOutputStream に書き込むか、または DataOutput がサポートする基本データ型用のメソッドを使用します。
直列化は、java.io.Serializable インタフェースを実装しないオブジェクトのフィールドの書き込みは行いません。直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。この場合、直列化可能でないクラスの状態を保存および再構築するのは、サブクラスの責任になります。そのクラスのフィールドがアクセス可能である (public、package、または protected) か、または状態を再構築するために使える get と set メソッドが存在する場合がしばしばあります。
writeObject と readObject メソッドで NotSerializableException をスローするように実装しておくと、オブジェクトの直列化を防止できます。例外は、ObjectOutputStream にキャッチされ、直列化処理を異常終了させます。 Externalizable インターフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。Externalizable インターフェースのメソッドである writeExternal と readExternal は、オブジェクトの状態を保存および復元するために呼び出されます。これらのメソッドは、クラスによって実装された場合には、ObjectOutput と ObjectInput のすべてのメソッドを使って、自身の状態の書き込みおよび読み込みを行うことができます。どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。 直列化可能フィールドおよび外部化可能データを除くプリミティブデータは、ブロックデータレコードとして ObjectOutputStream に書き込まれます。ブロックデータレコードは、ヘッダとデータで構成されます。ブロックデータのヘッダは、マーカおよびヘッダに続くバイト数で構成されます。連続するプリミティブデータの書き込みは、1 つのブロックデータレコードにマージされます。 (*) ブロックデータレコードに使用されるブロック係数は 1024 バイトです。 (*) 各ブロックデータレコードは、1024 バイトまで埋め込まれるか、ブロックデータモードの終了まで書き込まれます。 ObjectOutputStream のメソッド writeObject、defaultWriteObject、および writeFields を呼び出すと、最初に既存のブロックデータレコードが終了されます。
DataOutput
,
ObjectInputStream
,
Serializable
,
Externalizable
,
「オブジェクト直列化仕様の第 2 章オブジェクト出力クラス」内部クラスの概要 | |
static class |
ObjectOutputStream.PutField
ObjectOutput に書き込まれる持続フィールドへのプログラムによるアクセスを提供します。 |
コンストラクタの概要 | |
protected |
ObjectOutputStream()
ObjectOutputStream を完全に実装し直すサブクラスが、ObjectOutputStream のこの実装によって使用されたばかりの private データを割り当てる必要がないようにする手段を提供します。 |
|
ObjectOutputStream(OutputStream out)
指定された OutputStream に書き込む ObjectOutputStream を作成します。 |
メソッドの概要 | |
protected void |
annotateClass(Class cl)
サブクラスは、クラスのデータをストリームに保存できるようにこのメソッドを実装する場合があります。 |
protected void |
annotateProxyClass(Class cl)
サブクラスはこのメソッドを実装して、ダイナミックプロキシクラスに対する記述子とともにカスタムデータをストリームに格納します。 |
void |
close()
ストリームを閉じます。 |
void |
defaultWriteObject()
現在のクラスの非 static フィールドと非 transient フィールドを、ストリームに書き込みます。 |
protected void |
drain()
ObjectOutputStream にあるバッファデータをすべて空にします。 |
protected boolean |
enableReplaceObject(boolean enable)
ストリームのオブジェクトを置換できるようにします。 |
void |
flush()
ストリームをフラッシュします。 |
ObjectOutputStream.PutField |
putFields()
ストリームに書き込まれる持続フィールドをバッファに格納するために使用されるオブジェクトを取得します。 |
protected Object |
replaceObject(Object obj)
直列化の際に、ObjectOutputStream の信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 |
void |
reset()
ストリームにすでに書き込まれているオブジェクトの状態を無効にします。 |
void |
useProtocolVersion(int version)
ストリームの書き込み時に使用するストリームプロトコルのバージョンを指定します。 |
void |
write(byte[] b)
バイト配列を書き込みます。 |
void |
write(byte[] b,
int off,
int len)
バイト配列の一部を書き込みます。 |
void |
write(int data)
データのバイトを書き込みます。 |
void |
writeBoolean(boolean data)
boolean を書き込みます。 |
void |
writeByte(int data)
8 ビットのバイトを書き込みます。 |
void |
writeBytes(String data)
String をバイトの列として書き込みます |
void |
writeChar(int data)
16 ビットの char を書き込みます。 |
void |
writeChars(String data)
String を char の列として書き込みます。 |
protected void |
writeClassDescriptor(ObjectStreamClass classdesc)
ObjectOutputStream に指定されたクラス記述子を書き込みます。 |
void |
writeDouble(double data)
64 ビットの double を書き込みます。 |
void |
writeFields()
バッファに格納されたフィールドをストリームに書き込みます。 |
void |
writeFloat(float data)
32 ビットの float を書き込みます。 |
void |
writeInt(int data)
32 ビットの int を書き込みます。 |
void |
writeLong(long data)
64 ビットの long を書き込みます。 |
void |
writeObject(Object obj)
指定されたオブジェクトを ObjectOutputStream に書き込みます。 |
protected void |
writeObjectOverride(Object obj)
サブクラスによってデフォルトの writeObject メソッドのオーバーライドに使用されます。 |
void |
writeShort(int data)
16 ビットの short を書き込みます。 |
protected void |
writeStreamHeader()
サブクラスが自身のヘッダをストリームの前または後ろに追加できるように提供されています。 |
void |
writeUTF(String s)
この String のプリミティブデータを UTF 形式で書き込みます。 |
クラス java.lang.Object から継承したメソッド |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
コンストラクタの詳細 |
public ObjectOutputStream(OutputStream out) throws IOException
out
- 読み込み元の OutputStream
IOException
- 基本となる OutputStream が例外をスローした場合protected ObjectOutputStream() throws IOException, SecurityException
セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission
メソッドをアクセス権 SerializablePermission("enableSubclassImplementation")
で呼び出し、サブクラス化を有効にできるようにします。
IOException
- サブクラスによって呼び出されなかった場合SecurityException
- セキュリティマネージャが存在し、その checkPermission
メソッドがサブクラス化を有効にすることを拒否した場合SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
メソッドの詳細 |
protected void writeObjectOverride(Object obj) throws IOException
obj
- 基本となるストリームに書き込まれるオブジェクトIOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合ObjectOutputStream()
,
writeObject(Object)
public void useProtocolVersion(int version) throws IOException
このルーチンは、現在のバージョンの直列化が、前のバージョンのストリーム形式と下位互換性のある形式で書き込めるようにするフックを提供します。
下位互換性のない形式がさらに導入されるのを防ぐためにあらゆる努力が行われますが、選択の余地のない場合もあります。
version
- java.io.ObjectStreamConstants から ProtocolVersion を使用IllegalStateException
- オブジェクトが直列化されたあとに呼び出された場合IllegalArgumentException
- 渡されたバージョンが無効な場合IOException
- 入出力エラーが発生した場合ObjectStreamConstants.PROTOCOL_VERSION_1
,
ObjectStreamConstants.PROTOCOL_VERSION_2
public final void writeObject(Object obj) throws IOException
例外は、OutputStream に関する問題や、直列化するべきではないクラスについてスローされます。こすべての例外は、OutputStream にとって致命的で、OutputStream を不確定な状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼び出し側です。
ObjectOutput
内の writeObject
InvalidClassException
- 直列化で使用されるクラスになんらかの不具合があった場合NotSerializableException
- 直列化の対象オブジェクトが java.io.Serializable インタフェースを実装していない場合IOException
- 基本となる OutputStream が例外をスローした場合public void defaultWriteObject() throws IOException
IOException
- 基本となる OutputStream
の書き込み中に入出力エラーが発生した場合public ObjectOutputStream.PutField putFields() throws IOException
IOException
- 入出力エラーが発生した場合public void writeFields() throws IOException
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合NotActiveException
- オブジェクトの状態を書き込むためにクラスの writeObject メソッドが呼び出されなかったときに呼び出された場合public void reset() throws IOException
IOException
- オブジェクトを直列化中に reset() が呼び出された場合protected void annotateClass(Class cl) throws IOException
cl
- カスタムデータに注釈を付けるクラスIOException
- 基本となる OutputStream が例外をスローした場合protected void annotateProxyClass(Class cl) throws IOException
このメソッドはストリームの一意のプロキシクラス記述子のそれぞれについて 1 回だけ呼び出されます。ObjectOutputStream
にあるこのメソッドのデフォルト実装は何もしません。
ObjectInputStream
での対応するメソッドは resolveProxyClass
です。このメソッドをオーバーライドする指定されたサブクラス ObjectOutputStream
に対して、ObjectInputStream
の対応するサブクラスにある resolveProxyClass
メソッドは annotateProxyClass
が書き込む任意のデータまたはオブジェクトを読み込む必要があります。
cl
- カスタムデータに注釈を付けるプロキシクラスIOException
- 基本となる OutputStream
が例外をスローした場合ObjectInputStream.resolveProxyClass(String[])
protected Object replaceObject(Object obj) throws IOException
ObjectOutputStream.writeObject メソッドは Object タイプのパラメータ (Serializable タイプとは異なる) を取り、直列化可能でないオブジェクトが直列化可能オブジェクトに置き換えられるようにします。 サブクラスは、オブジェクトを置換するとき、直列化復元実行時に相補的に置換が行われるか、または置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保証する必要があります。フィールドまたは配列要素の型のサブクラスではない型のオブジェクトは、例外を発生させることによって直列化を中断し、その結果オブジェクトは格納されません。
このメソッドは、各オブジェクトが最初に検出されたときに 1 回だけ呼び出されます。これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。このメソッドは、置換されるメソッドか、またはオリジナルのどちらかを返さなければなりません。
置換されるオブジェクトとして null を返すこともできますが、オリジナルオブジェクトへの参照を含むクラスでは、null ではなくオブジェクトが返されることを仮定しているものがあり、この場合は NullReferenceException がスローされます。
obj
- 置き換えられるオブジェクトIOException
- 基本となる OutputStream が例外をスローした場合protected boolean enableReplaceObject(boolean enable) throws SecurityException
置換が可能になると、replaceObject メソッドが、直列化される各オブジェクトについて呼び出されます。
enable が true で、セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission
メソッドをアクセス権 SerializablePermission("enableSubstitution")
で呼び出し、ストリームのオブジェクトをストリームが置換できるようにします。
enable
- オブジェクトの置き換えを可能にする boolean パラメータSecurityException
- セキュリティマネージャが存在し、その checkPermission
メソッドが、ストリームのオブジェクトのストリームによる置換を許可しなかった場合SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
protected void writeStreamHeader() throws IOException
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合protected void writeClassDescriptor(ObjectStreamClass classdesc) throws IOException
readClassDescriptor
は、オーバーライドされクラス記述子をカスタムストリーム表現から復元する必要があります。デフォルトでは、このメソッドは、オブジェクト直列化仕様で定義された形式に従ってクラス記述子を書き込みます。
このメソッドは ObjectOutputStream が古い直列化ストリーム形式 (ObjectOutputStream の useProtocolVersion
メソッドを呼び出して設定) を使用していない場合に限り呼び出される点に注意してください。この直列化ストリームが古い形式 (PROTOCOL_VERSION_1
) を使用している場合、クラス記述子はオーバーライドされない方法またはカスタマイズできない方法で内部的に書き込まれます。
classdesc
- ストリームに書き込むクラス記述子IOException
- 入出力エラーが発生した場合ObjectInputStream.readClassDescriptor()
,
useProtocolVersion(int)
,
ObjectStreamConstants.PROTOCOL_VERSION_1
public void write(int data) throws IOException
ObjectOutput
内の write
OutputStream
内の write
data
- ストリームに書き込まれるバイトIOException
- 入出力エラーが発生した場合public void write(byte[] b) throws IOException
ObjectOutput
内の write
OutputStream
内の write
b
- 書き込まれるデータIOException
- 入出力エラーが発生した場合public void write(byte[] b, int off, int len) throws IOException
ObjectOutput
内の write
OutputStream
内の write
b
- 書き込まれるデータoff
- データの開始オフセットlen
- 書き込まれるバイト数IOException
- 入出力エラーが発生した場合public void flush() throws IOException
ObjectOutput
内の flush
OutputStream
内の flush
IOException
- 入出力エラーが発生した場合protected void drain() throws IOException
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void close() throws IOException
ObjectOutput
内の close
OutputStream
内の close
IOException
- 入出力エラーが発生した場合public void writeBoolean(boolean data) throws IOException
DataOutput
内の writeBoolean
data
- 書き込まれる boolean 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeByte(int data) throws IOException
DataOutput
内の writeByte
data
- 書き込まれるバイト値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeShort(int data) throws IOException
DataOutput
内の writeShort
data
- 書き込まれる short 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeChar(int data) throws IOException
DataOutput
内の writeChar
data
- 書き込まれる char 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeInt(int data) throws IOException
DataOutput
内の writeInt
data
- 書き込まれる int 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeLong(long data) throws IOException
DataOutput
内の writeLong
data
- 書き込まれる long 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeFloat(float data) throws IOException
DataOutput
内の writeFloat
data
- 書き込まれる float 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeDouble(double data) throws IOException
DataOutput
内の writeDouble
data
- 書き込まれる double 値IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeBytes(String data) throws IOException
DataOutput
内の writeBytes
data
- 書き込まれるバイトの文字列IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeChars(String data) throws IOException
DataOutput
内の writeChars
data
- 書き込まれる char の文字列IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeUTF(String s) throws IOException
DataOutput
内の writeUTF
s
- UTF 形式の StringIOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合
|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.