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, 2013, Oracle and/or its affiliates. All rights reserved.