public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
ストリームに書き込めるのは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
, 「Javaオブジェクト直列化仕様」のセクション2「オブジェクト出力クラス」修飾子と型 | クラスと説明 |
---|---|
static class |
ObjectOutputStream.PutField
ObjectOutputに書き込まれる持続フィールドへのプログラムによるアクセスを提供します。
|
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
修飾子 | コンストラクタと説明 |
---|---|
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形式で書き込みます。
|
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を不確定な状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼出し側です。
writeObject
、インタフェース: ObjectOutput
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
write
、インタフェース: DataOutput
write
、インタフェース: ObjectOutput
write
、クラス: OutputStream
val
- ストリームに書き込まれるバイトIOException
- 入出力エラーが発生した場合。public void write(byte[] buf) throws IOException
write
、インタフェース: DataOutput
write
、インタフェース: ObjectOutput
write
、クラス: OutputStream
buf
- 書き込まれるデータIOException
- 入出力エラーが発生した場合。OutputStream.write(byte[], int, int)
public void write(byte[] buf, int off, int len) throws IOException
write
、インタフェース: DataOutput
write
、インタフェース: ObjectOutput
write
、クラス: OutputStream
buf
- 書き込まれるデータoff
- データ内の開始オフセットlen
- 書き込まれるバイト数IOException
- 入出力エラーが発生した場合。public void flush() throws IOException
flush
、インタフェース: Flushable
flush
、インタフェース: ObjectOutput
flush
、クラス: OutputStream
IOException
- 入出力エラーが発生した場合。protected void drain() throws IOException
IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void close() throws IOException
close
、インタフェース: Closeable
close
、インタフェース: ObjectOutput
close
、インタフェース: AutoCloseable
close
、クラス: OutputStream
IOException
- 入出力エラーが発生した場合。public void writeBoolean(boolean val) throws IOException
writeBoolean
、インタフェース: DataOutput
val
- 書き込まれるbooleanIOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeByte(int val) throws IOException
writeByte
、インタフェース: DataOutput
val
- 書き込まれるバイト値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeShort(int val) throws IOException
writeShort
、インタフェース: DataOutput
val
- 書き込まれるshort値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeChar(int val) throws IOException
writeChar
、インタフェース: DataOutput
val
- 書き込まれるchar値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeInt(int val) throws IOException
writeInt
、インタフェース: DataOutput
val
- 書き込まれるint値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeLong(long val) throws IOException
writeLong
、インタフェース: DataOutput
val
- 書き込まれるlong値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeFloat(float val) throws IOException
writeFloat
、インタフェース: DataOutput
val
- 書き込まれるfloat値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeDouble(double val) throws IOException
writeDouble
、インタフェース: DataOutput
val
- 書き込まれるdouble値IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeBytes(String str) throws IOException
writeBytes
、インタフェース: DataOutput
str
- 書き込まれるバイトの文字列IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeChars(String str) throws IOException
writeChars
、インタフェース: DataOutput
str
- 書き込まれるcharの文字列IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合public void writeUTF(String str) throws IOException
writeUTF
、インタフェース: DataOutput
str
- 書き込まれる文字列IOException
- ベースとなるストリームの書込み中に入出力エラーが発生した場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.