|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.io.OutputStream java.io.ObjectOutputStream
public class ObjectOutputStream
ObjectOutputStream は、基本データ型と Java オブジェクトのグラフを OutputStream に書き込みます。これらのオブジェクトを読み込む (再構築する) には ObjectInputStream を使います。オブジェクトの持続的記憶は、そのストリームのためのファイルを使えば可能です。ストリームがネットワークソケットストリームの場合は、ほかのホストやほかのプロセス上でオブジェクトを再構築することもできます。
ストリームに書き込めるのは java.io.Serializable インタフェースをサポートするオブジェクトだけです。各直列化可能オブジェクトのクラスは、クラスの名前とシグニチャー、オブジェクトのフィールドと配列、および初期オブジェクトから参照されるほかのすべてのオブジェクトのクロージャーを含めてコード化されます。
オブジェクトをストリームに書き込むには writeObject メソッドを使います。String や配列を含む任意のオブジェクトが writeObject によって書き込まれます。複数のオブジェクトまたはプリミティブも、ストリームへの書き込みが可能です。オブジェクトを読み込むときは、対応する ObjectInputstream から同じ型として、かつ書き込まれたときと同じ順序で読み込まなければなりません。
基本データ型をストリームに書き込むには、DataOutput の適切なメソッドを使います。String を書き込む場合は writeUTF メソッドを使います。
オブジェクトのデフォルトの直列化機構は、オブジェクトのクラス、クラスのシグニチャー、およびすべての非 transient および非 static フィールドの値を書き込みます。ほかのオブジェクトへの参照 (transient および static フィールドは除く) があれば、これらのオブジェクトも書き込まれます。単一オブジェクトへの多重参照は参照共有機構によりエンコードされ、オブジェクトのグラフを、オリジナルが書き込まれたときの形状に復元することができます。
たとえば、ObjectInputStream の例で読み込めるようにオブジェクトを書き込むには、次のようにします。
FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close();
直列化と直列化復元の際に特殊な扱いが必要なクラスでは、正確に次のようなシグニチャーを持つ特殊なメソッドを実装する必要があります。
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void writeObject(java.io.ObjectOutputStream stream) throws IOException private void readObjectNoData() throws ObjectStreamException;
writeObject メソッドは、その特定のクラスのオブジェクトの状態を書き込んで、対応する readObject メソッドがオブジェクトの状態を復元できるようにする役割を担います。このメソッドは、オブジェクトのスーパークラスやサブクラスに属する状態に関与する必要はありません。状態を保存するには、writeObject メソッドを使って個々のフィールドを ObjectOutputStream に書き込むか、または DataOutput がサポートする基本データ型用のメソッドを使用します。
直列化では、java.io.Serializable インタフェースを実装しないオブジェクトのフィールドは書き込みません。直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。この場合、直列化可能でないクラスの状態を保存および復元するのは、サブクラスの責任になります。そのクラスのフィールドがアクセス可能である (public、package、または protected) 場合、あるいは状態の復元に利用できる set メソッドや get メソッドがある場合がしばしばあります。
writeObject および readObject メソッドで NotSerializableException をスローするように実装しておくと、オブジェクトの直列化を防止できます。例外が ObjectOutputStream にキャッチされ、直列化処理が異常終了します。
Externalizable インタフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。Externalizable インタフェースのメソッドである writeExternal と readExternal は、オブジェクトの状態を保存および復元するために呼び出されます。これらのメソッドは、クラスによって実装された場合には、ObjectOutput と ObjectInput のすべてのメソッドを使って、自身の状態の書き込みおよび読み込みを行うことができます。どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。
enum 定数の直列化は、通常の直列化可能または外部化可能オブジェクトとは異なります。enum 定数の直列化された形式を構成するのは、その名前だけです。定数のフィールド値は転送されません。enum 定数を直列化するには、その定数の name メソッドによって返される文字列を ObjectOutputStream で書き込みます。ほかの直列化可能または外部化可能オブジェクト同様に、enum 定数は、以後直列化ストリームに出現する後方参照の対象として機能できます。enum 定数を直列化するプロセスをカスタマイズすることはできません。enum 型で定義された、クラス固有の writeObject メソッドおよび writeReplace メソッドは、直列化復元の間は無視されます。同様に、serialPersistentFields または serialVersionUID のフィールド宣言もすべて無視されます。すべての enum 型は 0L で固定された serialVersionUID を持ちます。
直列化可能フィールドおよび外部化可能データを除くプリミティブデータは、ブロックデータレコードとして 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()
Reset は、ストリームにすでに書き込まれているオブジェクトの状態を無効にします。 |
void |
useProtocolVersion(int version)
ストリームの書き込み時に使用するストリームプロトコルのバージョンを指定します。 |
void |
write(byte[] buf)
バイト配列を書き込みます。 |
void |
write(byte[] buf,
int off,
int len)
バイト配列の一部を書き込みます。 |
void |
write(int val)
バイトを書き込みます。 |
void |
writeBoolean(boolean val)
boolean を書き込みます。 |
void |
writeByte(int val)
8 ビットのバイトを書き込みます。 |
void |
writeBytes(String str)
String をバイトの列として書き込みます |
void |
writeChar(int val)
16 ビットの char を書き込みます。 |
void |
writeChars(String str)
String を char の列として書き込みます。 |
protected void |
writeClassDescriptor(ObjectStreamClass desc)
指定されたクラス記述子を ObjectOutputStream に書き込みます。 |
void |
writeDouble(double val)
64 ビットの double を書き込みます。 |
void |
writeFields()
バッファーに格納されたフィールドをストリームに書き込みます。 |
void |
writeFloat(float val)
32 ビットの float を書き込みます。 |
void |
writeInt(int val)
32 ビットの int を書き込みます。 |
void |
writeLong(long val)
64 ビットの long を書き込みます。 |
void |
writeObject(Object obj)
指定されたオブジェクトを ObjectOutputStream に書き込みます。 |
protected void |
writeObjectOverride(Object obj)
サブクラスがデフォルトの writeObject メソッドをオーバーライドするために使用するメソッドです。 |
void |
writeShort(int val)
16 ビットの short を書き込みます。 |
protected void |
writeStreamHeader()
サブクラスが自身のヘッダーをストリームの前または後ろに追加できるように提供されています。 |
void |
writeUnshared(Object obj)
ObjectOutputStream に「共有されない」オブジェクトを書き込みます。 |
void |
writeUTF(String str)
この String のプリミティブデータを修正 UTF-8 形式で書き込みます。 |
クラス java.lang.Object から継承されたメソッド |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
コンストラクタの詳細 |
---|
public ObjectOutputStream(OutputStream out) throws IOException
セキュリティーマネージャーがインストールされている場合、ObjectOutputStream.putFields メソッドまたは ObjectOutputStream.writeUnshared メソッドをオーバーライドするサブクラスのコンストラクタによって SerializablePermission("enableSubclassImplementation") が直接または間接に呼び出されたときに、このコンストラクタはこのアクセス権を確認します。
out
- 書き込み先の出力ストリーム
IOException
- ストリームヘッダーの書き込み中に入出力エラーが発生した場合
SecurityException
- 信頼されていないサブクラスが、セキュリティー上重要なメソッドを不正にオーバーライドした場合
NullPointerException
- out
が null
の場合ObjectOutputStream()
,
putFields()
,
ObjectInputStream.ObjectInputStream(InputStream)
protected ObjectOutputStream() throws IOException, SecurityException
セキュリティーマネージャーがインストールされている場合、このメソッドはまずセキュリティーマネージャーの checkPermission
メソッドをアクセス権 SerializablePermission("enableSubclassImplementation")
で呼び出し、サブクラス化を有効にできるようにします。
SecurityException
- セキュリティーマネージャーが存在し、その checkPermission
メソッドがサブクラス化を有効にすることを拒否した場合
IOException
SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
メソッドの詳細 |
---|
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
obj
- 書き込まれるオブジェクト
InvalidClassException
- 直列化で使用されるクラスになんらかの不具合があった場合
NotSerializableException
- 直列化の対象オブジェクトが java.io.Serializable インタフェースを実装していない場合
IOException
- 基本となる OutputStream が例外をスローした場合protected void writeObjectOverride(Object obj) throws IOException
obj
- 基本となるストリームに書き込まれるオブジェクト
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合ObjectOutputStream()
,
writeObject(Object)
public void writeUnshared(Object obj) throws IOException
このメソッドをオーバーライドする ObjectOutputStream サブクラスは、SerializablePermission("enableSubclassImplementation") を持つセキュリティーコンテキスト内だけで構築できます。このアクセス権を持たないセキュリティーコンテキストでインスタンス化しようとすると、SecurityException がスローされます。
obj
- ストリームに書き込むオブジェクト
NotSerializableException
- 直列化するグラフ内のオブジェクトが Serializable インタフェースを実装しない場合
InvalidClassException
- 直列化するオブジェクトのクラスに問題がある場合
IOException
- 直列化中に入出力エラーが発生した場合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
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 desc) throws IOException
readClassDescriptor
をオーバーライドして、カスタムのストリーム表現からクラス記述子を再構築するようにしてください。デフォルトでは、このメソッドはクラス記述子をオブジェクト直列化仕様に定義された形式で書き込みます。
このメソッドを呼び出すことができるのは、ObjectOutputStream の useProtocolVersion
メソッドを呼び出すことによって設定される古い直列化ストリーム形式を ObjectOutputStream が使用していない場合のみである点に注意してください。この直列化ストリームが古い形式 (PROTOCOL_VERSION_1
) を使用している場合、クラス記述子はオーバーライドまたはカスタマイズが不可能な方法で内部的に書き込まれます。
desc
- ストリームに書き込むクラス記述子
IOException
- 入出力エラーが発生した場合ObjectInputStream.readClassDescriptor()
,
useProtocolVersion(int)
,
ObjectStreamConstants.PROTOCOL_VERSION_1
public void write(int val) throws IOException
DataOutput
内の write
ObjectOutput
内の write
OutputStream
内の write
val
- ストリームに書き込まれるバイト
IOException
- 入出力エラーが発生した場合public void write(byte[] buf) throws IOException
DataOutput
内の write
ObjectOutput
内の write
OutputStream
内の write
buf
- 書き込まれるデータ
IOException
- 入出力エラーが発生した場合OutputStream.write(byte[], int, int)
public void write(byte[] buf, int off, int len) throws IOException
DataOutput
内の write
ObjectOutput
内の write
OutputStream
内の write
buf
- 書き込まれるデータoff
- データの開始オフセットlen
- 書き込まれるバイト数
IOException
- 入出力エラーが発生した場合public void flush() throws IOException
Flushable
内の flush
ObjectOutput
内の flush
OutputStream
内の flush
IOException
- 入出力エラーが発生した場合protected void drain() throws IOException
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void close() throws IOException
Closeable
内の close
ObjectOutput
内の close
OutputStream
内の close
IOException
- 入出力エラーが発生した場合public void writeBoolean(boolean val) throws IOException
DataOutput
内の writeBoolean
val
- 書き込まれる boolean 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeByte(int val) throws IOException
DataOutput
内の writeByte
val
- 書き込まれるバイト値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeShort(int val) throws IOException
DataOutput
内の writeShort
val
- 書き込まれる short 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeChar(int val) throws IOException
DataOutput
内の writeChar
val
- 書き込まれる char 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeInt(int val) throws IOException
DataOutput
内の writeInt
val
- 書き込まれる int 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeLong(long val) throws IOException
DataOutput
内の writeLong
val
- 書き込まれる long 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeFloat(float val) throws IOException
DataOutput
内の writeFloat
val
- 書き込まれる float 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeDouble(double val) throws IOException
DataOutput
内の writeDouble
val
- 書き込まれる double 値
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeBytes(String str) throws IOException
DataOutput
内の writeBytes
str
- 書き込まれるバイトの文字列
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeChars(String str) throws IOException
DataOutput
内の writeChars
str
- 書き込まれる char の文字列
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合public void writeUTF(String str) throws IOException
DataOutput
内の writeUTF
str
- 書き込まれる文字列
IOException
- 基本となるストリームの書き込み中に入出力エラーが発生した場合
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。