- すべての実装されたインタフェース:
Closeable
,DataInput
,ObjectInput
,ObjectStreamConstants
,AutoCloseable
警告: 信頼できないデータの直列化復元は、本質的に危険であり、回避する必要があります。 「Java SEに対するセキュア・コーディングのガイドライン」の"直列化および直列化復元"セクションに従って、信頼できないデータを慎重に検証する必要があります。 「直列化フィルタリング」では、シリアル・フィルタの使いやすさに関するベスト・プラクティスについて説明します。
ObjectOutputStreamとObjectInputStreamは、FileOutputStreamまたはFileInputStreamとともに使えば、アプリケーションに、オブジェクトのグラフのための持続的なストレージを提供することができます。 ObjectInputStreamは、事前に直列化されたオブジェクトを元に戻すために使います。 ほかの使用方法としては、ソケット・ストリームの使用による、ホスト間でのオブジェクトの受け渡しや、リモート通信システムでの属性やパラメータの整列や整列解除があります。
ObjectInputStreamは、ストリームから作成されたオブジェクト・グラフでのすべての型のオブジェクトが、Java Virtual Machineに存在するクラスに確実にマッチするようにします。 クラスは、標準のメカニズムを使って必要に応じてロードされます。
ストリームから読み込むことができるのは、java.io.Serializableインタフェースかjava.io.Externalizableインタフェースをサポートするオブジェクトだけです。
オブジェクトをストリームから読み込むにはreadObject
メソッドを使います。 希望の型を取得するには、Javaの安全なキャストを使う必要があります。 Javaでは、文字列と配列はオブジェクトで、直列化の間はオブジェクトとして扱われます。 それらを読み込む際には、希望の型にキャストされている必要があります。
プリミティブ・データ型をストリームから読み込むには、DataInputの適切なメソッドを使います。
オブジェクトのデフォルトの直列化復元メカニズムは、各フィールドの内容を、書き込まれたときの状態に戻します。 transientまたはstaticと宣言されたフィールドは、直列化復元処理では無視されます。 ほかのオブジェクトを参照すると、それらのオブジェクトは、必要に応じてストリームから読み込まれます。 オブジェクトのグラフは、参照共有メカニズムを使って正しく復元されます。 直列化復元が行われるときには、常に新しいオブジェクトが割り当てられ、それによって既存のオブジェクトへの上書きが防止されます。
オブジェクトの読込みは、新しいオブジェクトのコンストラクタの実行に似ています。 メモリーがオブジェクトに割り当てられ、ゼロ(NULL)に初期化されます。 直列化可能でないクラスに対して、引数なしのコンストラクタが呼び出されたあと、直列化可能クラスのフィールドが、java.lang.Objectにもっとも近いクラスから始まって、もっともオブジェクトに固有のクラスで終わるストリームから復元されます。
たとえば、ObjectOutputStreamの例で書き込まれたストリームからの読込みは、次のように行います。
FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject(); ois.close();
クラスは、インタフェースjava.io.Serializableまたはjava.io.Externalizableを実装することによって、クラスがどのように直列化されるかを制御します。
Serializableインタフェースを実装することによって、オブジェクトの直列化が、オブジェクトの状態全体の保存と復元を行うことが可能になり、またクラスが、ストリームの書込み時とストリームの読込み時の間に展開することが可能になります。 オブジェクトの直列化は、オブジェクト間の参照を自動的にトラバースし、オブジェクト・グラフの全体を保存および復元します。
直列化処理と直列化復元処理のときに特別な操作を必要とするSerializableクラスは、次のメソッドを実装する必要があります。
private void writeObject(java.io.ObjectOutputStream stream) throws IOException; private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void readObjectNoData() throws ObjectStreamException;
readObjectメソッドは、対応するwriteObjectメソッドによってストリームに書き込まれたデータを使用する特定のクラスについて、オブジェクトの状態を読み込みおよび復元する責任を持ちます。 このメソッドは、そのスーパー・クラスやサブクラスに属する状態に関与する必要はありません。 状態を復元するには、個々のフィールドについてObjectInputStreamからデータを読み込み、オブジェクトの適切なフィールドへの割り当てを行います。 プリミティブ・データ型の読込みは、DataInputによってサポートされます。
オブジェクト・データを読み込もうとするときに、その位置が対応するwriteObjectメソッドによって書き込まれたカスタム・データの境界を超えている場合は、eofフィールドの値がtrueの状態でOptionalDataExceptionがスローされます。 オブジェクトを直列化して読み込もうとするときに、その位置が割当て済みデータの終わりを超えている場合は、ストリームの場合と同様に、データの終わりを示す例外が返されます。つまり、バイト単位の読込みでは、バイトが読み込まれたときに -1が返されます。プリミティブ読込みでは、EOFExceptionがスローされます。 対応するwriteObjectメソッドがない場合は、デフォルトの直列化データの終わりが割当て済みデータの終わりになります。
プリミティブ読み込みとオブジェクト読込みがreadExternalメソッドから呼び出された場合は、両方とも同じように動作します。ストリームの位置が対応するwriteExternalメソッドによって書き込まれたデータの終わりにある場合、オブジェクト読込みではeofがtrueに設定された状態でOptionalDataExceptionがスローされ、バイトの読込みでは -1を返し、プリミティブ読込みではEOFExceptionがスローされます。 ただし、古いObjectStreamConstants.PROTOCOL_VERSION_1
プロトコルを使用して書き込まれたストリームでは、この動作は適用されません。writeExternalメソッドと異なり、データの終わりが書き込まれないため、データの終わりを検出できないためです。
readObjectNoDataメソッドは、あるクラスが直列化復元されるオブジェクトのスーパー・クラスとして直列化ストリームに指定されていないときに、そのクラスについてそのオブジェクトの状態を初期化します。 これは、受け取り側が、送り側とは異なるバージョンの直列化復元されたインスタンスのクラスを使用し、受け取り側のバージョンが送り側のバージョンによって継承されないクラスを継承する場合に発生する可能性があります。 また、直列化ストリームが改変された場合にも発生することがあります。したがって、readObjectNoDataは、「悪意のある」または不正なソース・ストリームであっても、直列化復元されたオブジェクトを正しく初期化するのに役立ちます。
直列化は、java.io.Serializableインタフェースを実装しないオブジェクトのフィールドの読込みや、それらのフィールドへの値の割当ては行いません。 直列化可能でないオブジェクトのサブクラスを直列化可能にすることができます。 この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。 この場合、直列化可能でないクラスの状態を保存および復元するのは、サブクラスの責任になります。 そのクラスのフィールドがアクセス可能である(public、package、またはprotected)場合、あるいは状態の復元に利用できるsetメソッドやgetメソッドがある場合がしばしばあります。
直列化復元中にストリームの内容をフィルタリングすることができます。 ObjectInputStream上の「フィルタが設定されている」の場合、ObjectInputFilter
は、クラス、配列の長さ、ストリーム内の参照数、入力ストリームから消費されたバイト数、許容されないバイト数を確認できます。そうでない場合は、直列化復元を終了できます。 「システム全体のフィルタ」は、setObjectInputFilter
を使用して置き換えない限り、各ObjectInputStream
に適用されるように構成することができます。
オブジェクトを直列化復元する間に発生したすべての例外は、ObjectInputStreamにキャッチされ、読込み処理を異常終了させます。
Externalizableインタフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。 ExternalizableインタフェースのメソッドであるwriteExternalとreadExternalは、オブジェクトの状態を保存および復元するために呼び出されます。 これらのメソッドは、クラスによって実装された場合には、ObjectOutputとObjectInputのすべてのメソッドを使って、自身の状態の書き込みおよび読込みを行うことができます。 どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。
enum定数の直列化復元は、通常の直列化可能または外部化可能オブジェクトとは異なります。 enum定数の直列化された形式を構成するのは、その名前だけです。定数のフィールド値は転送されません。 enum定数を直列化復元するには、ObjectInputStreamでストリームから定数名を読み込みます。次に、enum定数の基底型と受け取った定数名を引数としてstaticメソッドのEnum.valueOf(Class, String)
を呼び出し、直列化復元された定数を取得します。 他の直列化可能または外部化可能オブジェクトと同様に、enum定数は直列化ストリームにその後出現する後方参照のターゲットとして機能できます。 enum定数を直列化復元するプロセスをカスタマイズすることはできません。enum型で定義された、クラス固有のreadObject、readObjectNoData、およびreadResolveメソッドはどれも直列化復元の間は無視されます。 同様に、serialPersistentFieldsまたはserialVersionUIDフィールド宣言もすべて無視されます。すべてのenum型は0Lの固定されたserialVersionUIDを持ちます。
レコードの直列化は、通常の直列化可能オブジェクトまたは外部化可能オブジェクトとは異なります。 レコードの直列化復元中に、レコード標準コンストラクタが呼び出されてレコード・オブジェクトが構成されます。 readObjectやwriteObjectなどの特定の直列化関連メソッドは、直列化可能レコードでは無視されます。 詳細は、「Javaオブジェクト直列化仕様セクション1.13、"レコードの直列化"」を参照してください。
- 導入されたバージョン:
- 1.1
- 関連項目:
DataInput
,ObjectOutputStream
,Serializable
, 「Javaオブジェクト直列化仕様セクション3、"オブジェクト入力クラス"」
-
ネストされたクラスのサマリー
ネストされたクラス -
フィールドのサマリー
インタフェース java.io.ObjectStreamConstantsで宣言されたフィールド
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, SERIAL_FILTER_PERMISSION, 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
ObjectInputStreamを完全に再実装するサブクラスが、ObjectInputStreamのこの実装によって使用されたばかりのprivateデータを割り当てる必要がないようにする手段を提供します。指定されたInputStreamから読み込むObjectInputStreamを作成します。 -
メソッドのサマリー
修飾子と型メソッド説明int
ブロックせずに読み込むことができるバイト数を返します。void
close()
入力ストリームを閉じます。void
現在のクラスの非staticおよび非transientフィールドを、このストリームから読み込みます。protected boolean
enableResolveObject(boolean enable)
ストリームがストリームから読み込まれたオブジェクトの置換を行うことを可能にします。このストリームの直列化フィルタを返します。int
read()
データのバイトを読み込みます。int
read(byte[] buf, int off, int len)
バイト配列に読み込みます。boolean
booleanを読み込みます。byte
readByte()
8ビットのバイトを読み込みます。char
readChar()
16ビットのcharを読み込みます。protected ObjectStreamClass
直列化ストリームからクラス記述子を読み込みます。double
64ビットのdoubleを読み込みます。ストリームから持続フィールドを読み込み、それらを名前を指定してアクセスできるようにします。float
32ビットのfloatを読み込みます。void
readFully(byte[] buf)
バイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。void
readFully(byte[] buf, int off, int len)
バイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。int
readInt()
32ビットのintを読み込みます。readLine()
非推奨。このメソッドでは、バイトから文字への変換が正しく行われません。long
readLong()
64ビットのlongを読み込みます。ObjectInputStreamからオブジェクトを読み込みます。protected Object
このメソッドは、引数なしのprotectedコンストラクタを使用して、ObjectInputStreamを構築したObjectInputStreamの信頼できるサブクラスによって呼び出されます。short
16ビットのshortを読み込みます。protected void
サブクラスが自身のストリーム・ヘッダーの読み込みと検証を行えるようにするために提供されています。ObjectInputStreamから「共有されない」オブジェクトを読み込みます。int
符号なし8ビット・バイトを読み込みます。int
符号なし16ビットのshortを読み込みます。readUTF()
修正UTF-8形式の文字列を読み込みます。void
registerValidation(ObjectInputValidation obj, int prio)
オブジェクト・グラフが返される前に検証されるべきオブジェクトを登録します。protected Class<?>
resolveClass(ObjectStreamClass desc)
指定されたストリーム・クラスの記述に対応するローカル・クラスをロードします。protected Object
resolveObject(Object obj)
このメソッドは、直列化復元の際に、ObjectInputStreamの信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。protected Class<?>
resolveProxyClass(String[] interfaces)
プロキシ・クラス記述子で指定されたインタフェースを実装するプロキシ・クラスを返します。サブクラスはこのメソッドを実装してダイナミック・プロキシ・クラスの記述子とともにストリームからカスタム・データを読み込み、インタフェースやプロキシ・クラスの代替ローディング・メカニズムを使用できるようにします。void
setObjectInputFilter(ObjectInputFilter filter)
ストリームの直列化フィルタを設定します。int
skipBytes(int len)
バイトをスキップします。クラス java.io.InputStreamで宣言されたメソッド
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
クラス java.lang.Objectで宣言されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
インタフェース java.io.ObjectInputで宣言されたメソッド
read, skip
-
コンストラクタの詳細
-
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException指定されたInputStreamから読み込むObjectInputStreamを作成します。 直列化ストリーム・ヘッダーは、ストリームから読み込まれたあと、検証されます。 このコンストラクタは、対応するObjectOutputStreamがヘッダーを書き込んでフラッシュするまでブロックします。直列化フィルタは「システム全体のフィルタ」の値に初期化されます。
セキュリティ・マネージャがインストールされている場合、ObjectInputStream.readFieldsメソッドまたはObjectInputStream.readUnsharedメソッドをオーバーライドするサブクラスのコンストラクタによってSerializablePermission("enableSubclassImplementation")が直接または間接に呼び出されたときに、このコンストラクタはこのアクセス権を確認します。
- パラメータ:
in
- 読込み元の入力ストリーム- 例外:
StreamCorruptedException
- ストリーム・ヘッダーが不正な場合IOException
- ストリーム・ヘッダーの読込み中に入出力エラーが発生した場合SecurityException
- 信頼できないサブクラスが、セキュリティ上重要なメソッドを不正にオーバーライドした場合NullPointerException
-in
がnull
である場合- 関連項目:
ObjectInputStream()
,readFields()
,ObjectOutputStream(OutputStream)
-
ObjectInputStream
protected ObjectInputStream() throws IOException, SecurityExceptionObjectInputStreamを完全に再実装するサブクラスが、ObjectInputStreamのこの実装によって使用されたばかりのprivateデータを割り当てる必要がないようにする手段を提供します。直列化フィルタは「システム全体のフィルタ」の値に初期化されます。
セキュリティ・マネージャがインストールされている場合、このメソッドはまずセキュリティ・マネージャの
checkPermission
メソッドをアクセス権SerializablePermission("enableSubclassImplementation")
で呼び出し、サブクラス化を有効にできるようにします。- 例外:
SecurityException
- セキュリティ・マネージャが存在し、そのcheckPermission
メソッドがサブクラス化を有効にすることを拒否した場合。IOException
- このストリームの作成中に入出力エラーが発生した場合- 関連項目:
SecurityManager.checkPermission(java.security.Permission)
、SerializablePermission
-
-
メソッドの詳細
-
readObject
public final Object readObject() throws IOException, ClassNotFoundExceptionObjectInputStreamからオブジェクトを読み込みます。 オブジェクトのクラス、クラスのシグネチャ、クラスの非transientフィールドおよび非staticフィールドの値とそのすべてのスーパー・タイプが読み込まれます。 あるクラスについてのデフォルトの直列化復元は、writeObjectメソッドとreadObjectメソッドを使用してオーバーライドできます。 このオブジェクトによって参照されるオブジェクトは中間的に読み込まれ、それによって、完全に同等なオブジェクト・グラフがreadObjectによって再構築されます。ルート・オブジェクトは、参照するフィールドとオブジェクトのすべてが復元された時、完全に復元されます。 この時点で、それらの登録された優先順位に基づいて、オブジェクト検証コールバックが実行されます。 このコールバックは、(特別なreadObjectメソッドの)オブジェクトによって、それらが個別に復元されるときに登録されます。
null
ではなく、直列化フィルタが各オブジェクト(レギュラまたはクラス) readに対して呼び出され、ルート・オブジェクトが再構築されます。 詳細については、setObjectInputFilter
を参照してください。例外は、InputStreamに関する問題や、直列化復元すべきではないクラスについてスローされます。 すべての例外は、InputStreamにとって致命的で、InputStreamを不確定の状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼出し側です。
- 定義:
readObject
、インタフェース:ObjectInput
- 戻り値:
- ストリームから読み込まれたオブジェクト
- 例外:
ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合。InvalidClassException
- 直列化で使用されるクラスになんらかの不具合があった場合。StreamCorruptedException
- ストリームの制御情報に一貫性がない場合。OptionalDataException
- プリミティブ・データが、オブジェクトではなくストリームに見つかった場合。IOException
- 通常の入出力関連の例外が発生した場合。
-
readObjectOverride
protected Object readObjectOverride() throws IOException, ClassNotFoundExceptionこのメソッドは、引数なしのprotectedコンストラクタを使用して、ObjectInputStreamを構築したObjectInputStreamの信頼できるサブクラスによって呼び出されます。 サブクラスは、修飾子がfinalのオーバーライド・メソッドを提供するとみなされます。- 戻り値:
- ストリームから読み込まれたオブジェクト。
- 例外:
ClassNotFoundException
- 直列化されたオブジェクトのクラス定義が見つからなかった場合。OptionalDataException
- プリミティブ・データが、オブジェクトではなくストリームに見つかった場合。IOException
- ベースとなるストリームの読込み中に入出力エラーが発生した場合- 導入されたバージョン:
- 1.2
- 関連項目:
ObjectInputStream()
,readObject()
-
defaultReadObject
public void defaultReadObject() throws IOException, ClassNotFoundException現在のクラスの非staticおよび非transientフィールドを、このストリームから読み込みます。 このメソッドを呼び出すことができるのは、直列化復元されているクラスのreadObjectメソッドだけです。 別の方法で呼び出された場合はNotActiveExceptionをスローします。- 例外:
ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合。IOException
- 入出力エラーが発生した場合。NotActiveException
- ストリームが現在オブジェクトを読み込んでいない場合。
-
readFields
public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundExceptionストリームから持続フィールドを読み込み、それらを名前を指定してアクセスできるようにします。- 戻り値:
- 直列化復元されているオブジェクトの持続フィールドを表す
GetField
オブジェクト - 例外:
ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合。IOException
- 入出力エラーが発生した場合。NotActiveException
- ストリームが現在オブジェクトを読み込んでいない場合。- 導入されたバージョン:
- 1.2
-
registerValidation
public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectExceptionオブジェクト・グラフが返される前に検証されるべきオブジェクトを登録します。 resolveObjectに似ていますが、これらの検証はオブジェクト・グラフ全体が再構築されたあとに呼び出される点が異なります。 通常、readObjectメソッドは、ストリームとともにオブジェクトを登録し、それによってオブジェクトのすべてが復元されたときに最終的な検証を実行できるようにします。- パラメータ:
obj
- 検証のコールバックを受け取るオブジェクト。prio
- コールバックの順序を制御する値。0が適切なデフォルト値である。 早くコールバックする場合は大きい番号を、あとでコールバックする場合は小さい番号を使う。 同じ優先順位内では、コールバックの処理に特別な順序はない。- 例外:
NotActiveException
- ストリームが現在オブジェクトを読み込んでいないため、コールバックを登録できない場合。InvalidObjectException
- 検証オブジェクトがnullである場合。
-
resolveClass
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException指定されたストリーム・クラスの記述に対応するローカル・クラスをロードします。 サブクラスは、このメソッドを実装して、クラスを代替ソースから取得できるようにすることができます。ObjectOutputStream
内で対応するメソッドはannotateClass
です。 このメソッドは、ストリームの一意のクラスそれぞれについて1回だけ呼び出されます。 このメソッドは、代替のロード・メカニズムを使用するためにサブクラスによって実装することができますが、Class
オブジェクトを返す必要があります。 返されたクラスが配列クラスでない場合は、そのserialVersionUIDが、直列化されたクラスのserialVersionUIDと比較されます。不一致がある場合、直列化復元が失敗し、InvalidClassException
がスローされます。ObjectInputStream
内のこのメソッドのデフォルト実装は、次の呼出しの結果を返しますClass.forName(desc.getName(), false, loader)
ここで、loader
は、現在のスレッド・スタック(現在実行中のメソッドから開始)上の「プラットフォーム・クラス・ローダー」もその祖先でもない最初のクラス・ローダーです。それ以外の場合、loader
は「プラットフォーム・クラス・ローダー」です。 この呼出しの結果がClassNotFoundException
で、渡されたObjectStreamClass
インスタンスの名前がプリミティブ型またはvoidに対するJava言語のキーワードである場合は、そのプリミティブ型またはvoidを表すClass
オブジェクトが返されます。たとえば、"int"
という名前のObjectStreamClass
はInteger.TYPE
に解決されます。 そうでない場合は、このメソッドの呼出し側にClassNotFoundException
がスローされます。- パラメータ:
desc
-ObjectStreamClass
クラスのインスタンス- 戻り値:
desc
に対応するClass
オブジェクト- 例外:
IOException
- 通常の入出力関連の例外が発生した場合。ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合。
-
resolveProxyClass
protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundExceptionプロキシ・クラス記述子で指定されたインタフェースを実装するプロキシ・クラスを返します。サブクラスはこのメソッドを実装してダイナミック・プロキシ・クラスの記述子とともにストリームからカスタム・データを読み込み、インタフェースやプロキシ・クラスの代替ローディング・メカニズムを使用できるようにします。このメソッドはストリームの一意の各プロキシ・クラス記述子について1回だけ呼び出されます。
ObjectOutputStream
内で対応するメソッドはannotateProxyClass
です。 このメソッドをオーバーライドするObjectInputStream
の指定されたサブクラスについては、ObjectOutputStream
内の対応するサブクラスのannotateProxyClass
メソッドが、このメソッドが読み込むデータまたはオブジェクトをすべて書き込む必要があります。ObjectInputStream
内のこのメソッドのデフォルト実装は、interfaces
パラメータに指定されたインタフェースに対するClass
オブジェクトのリストを使用してProxy.getProxyClass
を呼び出した結果を返します。 各インタフェース名i
に対するClass
オブジェクトは、次の呼出しによって返された値です。Class.forName(i, false, loader)
ここで、loader
は、現在のスレッド・スタック(現在実行中のメソッドから開始)上の「プラットフォーム・クラス・ローダー」もその祖先でもない最初のクラス・ローダーです。それ以外の場合、loader
は「プラットフォーム・クラス・ローダー」です。 解決されたインタフェースのすべてがpublicである場合は、このloader
と同じ値がProxy.getProxyClass
に渡されるクラス・ローダーにもなります。一方、publicでないインタフェースが存在する場合は、代わりにそれらのインタフェースのクラス・ローダーが渡されます。publicでないインタフェース・クラス・ローダーが複数検出された場合は、IllegalAccessError
がスローされます。Proxy.getProxyClass
からIllegalArgumentException
がスローされると、resolveProxyClass
はそのIllegalArgumentException
を含むClassNotFoundException
をスローします。- パラメータ:
interfaces
- プロキシ・クラス記述子に直列化復元されたインタフェース名のリスト- 戻り値:
- 指定されたインタフェースのプロキシ・クラス
- 例外:
IOException
- ベースとなるInputStream
が例外をスローした場合ClassNotFoundException
- プロキシ・クラスまたは指定されたインタフェースがどれも見つからなかった場合- 導入されたバージョン:
- 1.3
- 関連項目:
ObjectOutputStream.annotateProxyClass(Class)
-
resolveObject
protected Object resolveObject(Object obj) throws IOExceptionこのメソッドは、直列化復元の際に、ObjectInputStreamの信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 オブジェクトの置換は、enableResolveObjectが呼び出されるまでは行えません。 enableResolveObjectメソッドは、オブジェクトの解決を要求しているストリームが信頼できるかどうかを調べます。 直列化可能オブジェクトへのすべての参照は、resolveObjectに渡されます。 オブジェクトのprivate状態が意図せずに公開されることがないように、resolveObjectを使うのは信頼できるストリームに限定されます。このメソッドは、オブジェクトが読み込まれたあと、readObjectから復帰する前に呼び出されます。 デフォルトのresolveObjectメソッドは、同じオブジェクトを返します。
サブクラスは、オブジェクトを置換するとき、置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保つようにする必要があります。 フィールドまたは配列要素の型のサブクラスではない型のオブジェクトは、例外を発生させることによって直列化を中断し、その結果オブジェクトは格納されません。
このメソッドは、各オブジェクトが最初に検出されたときに1回だけ呼び出されます。 これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。
- パラメータ:
obj
- 置換されるオブジェクト- 戻り値:
- 置換されたオブジェクト
- 例外:
IOException
- 通常の入出力関連の例外が発生した場合。
-
enableResolveObject
protected boolean enableResolveObject(boolean enable) throws SecurityExceptionストリームがストリームから読み込まれたオブジェクトの置換を行うことを可能にします。 有効にすると、resolveObject(java.lang.Object)
メソッドが直列化復元されるすべてのオブジェクトに対して呼び出されます。オブジェクトの置換が現在有効ではなく、
enable
がtrueであり、セキュリティ・マネージャがインストールされている場合、このメソッドは、セキュリティ・マネージャcheckPermission
メソッドをSerializablePermission("enableSubstitution")
アクセス権で最初に呼び出して、呼び出し側がストリームによるオブジェクトの置換ストリームから読み込みます。- パラメータ:
enable
- 直列化復元される各オブジェクトについてresolveObject
の使用を有効にする場合はtrue- 戻り値:
- このメソッドが呼び出される前の設定
- 例外:
SecurityException
- セキュリティ・マネージャが存在し、checkPermission
メソッドが、ストリームがストリームから読み取られたオブジェクトの置換を行うことを許可しない場合。- 関連項目:
SecurityManager.checkPermission(java.security.Permission)
、SerializablePermission
-
readStreamHeader
protected void readStreamHeader() throws IOException, StreamCorruptedExceptionサブクラスが自身のストリーム・ヘッダーの読み込みと検証を行えるようにするために提供されています。 このメソッドは、マジック番号とバージョン番号を読み込みます。- 例外:
IOException
- ベースとなるInputStream
の読込み中に入出力エラーが発生した場合StreamCorruptedException
- ストリームの制御情報に一貫性がない場合
-
readClassDescriptor
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException直列化ストリームからクラス記述子を読み込みます。 このメソッドは、ObjectInputStreamが直列化ストリームの次のアイテムとしてクラス記述子を要求すると呼び出されます。writeClassDescriptor
メソッドをオーバーライドしたObjectOutputStreamのサブクラスによって標準ではない形式で書き込まれたクラス記述子に読み込むために、ObjectInputStreamのサブクラスがこのメソッドをオーバーライドすることがあります。 デフォルトでは、このメソッドはクラス記述子をオブジェクト直列化仕様に定義された形式で読み込みます。- 戻り値:
- 読み込まれたクラス記述子
- 例外:
IOException
- 入出力エラーが発生した場合。ClassNotFoundException
- クラス記述子表現に使用した直列化されたオブジェクトのクラスが見つからなかった場合- 導入されたバージョン:
- 1.3
- 関連項目:
ObjectOutputStream.writeClassDescriptor(java.io.ObjectStreamClass)
-
read
public int read() throws IOExceptionデータのバイトを読み込みます。 このメソッドは、有効な入力がない場合はブロックします。- 定義:
read
、インタフェース:ObjectInput
- 定義:
read
、クラス:InputStream
- 戻り値:
- 読み込まれたバイト。ストリームの終わりに達した場合は -1。
- 例外:
IOException
- 入出力エラーが発生した場合。
-
read
public int read(byte[] buf, int off, int len) throws IOExceptionバイト配列に読み込みます。 このメソッドは、入力の一部が利用できるようになるまでブロックします。 バイトの長さを正確に読み込むには、java.io.DataInputStream.readFullyを使用してください。- 定義:
read
、インタフェース:ObjectInput
- オーバーライド:
read
、クラス:InputStream
- パラメータ:
buf
- データの読込み先のバッファoff
- 転送先配列の開始オフセットbuf
len
- 読み込まれる最大バイト数- 戻り値:
- 実際に読み込まれたバイト数。ストリームの終わりに達した場合は -1。
- 例外:
NullPointerException
-buf
がnull
の場合。IndexOutOfBoundsException
-off
が負の場合、len
は負であるか、またはlen
がbuf.length - off
より大きい。IOException
- 入出力エラーが発生した場合。- 関連項目:
DataInputStream.readFully(byte[],int,int)
-
available
public int available() throws IOExceptionブロックせずに読み込むことができるバイト数を返します。- 定義:
available
、インタフェース:ObjectInput
- オーバーライド:
available
、クラス:InputStream
- 戻り値:
- 読込み可能なバイト数。
- 例外:
IOException
- ベースとなるInputStream
の読込み中に入出力エラーが発生した場合
-
close
public void close() throws IOException入力ストリームを閉じます。 ストリームに関連するすべてのリソースを解放するために呼び出す必要があります。- 定義:
close
、インタフェース:AutoCloseable
- 定義:
close
、インタフェース:Closeable
- 定義:
close
、インタフェース:ObjectInput
- オーバーライド:
close
、クラス:InputStream
- 例外:
IOException
- 入出力エラーが発生した場合。
-
readBoolean
public boolean readBoolean() throws IOExceptionbooleanを読み込みます。- 定義:
readBoolean
、インタフェース:DataInput
- 戻り値:
- 読み込まれるboolean値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readByte
public byte readByte() throws IOException8ビットのバイトを読み込みます。- 定義:
readByte
、インタフェース:DataInput
- 戻り値:
- 読み込まれる8ビットのバイト値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readUnsignedByte
public int readUnsignedByte() throws IOException符号なし8ビット・バイトを読み込みます。- 定義:
readUnsignedByte
、インタフェース:DataInput
- 戻り値:
- 読み込まれる8ビットのバイト値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readChar
public char readChar() throws IOException16ビットのcharを読み込みます。- 定義:
readChar
、インタフェース:DataInput
- 戻り値:
- 読み込まれる16ビットのchar値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readShort
public short readShort() throws IOException16ビットのshortを読み込みます。- 定義:
readShort
、インタフェース:DataInput
- 戻り値:
- 読み込まれる16ビットのshort値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readUnsignedShort
public int readUnsignedShort() throws IOException符号なし16ビットのshortを読み込みます。- 定義:
readUnsignedShort
、インタフェース:DataInput
- 戻り値:
- 読み込まれる16ビットのshort値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readInt
public int readInt() throws IOException32ビットのintを読み込みます。- 定義:
readInt
、インタフェース:DataInput
- 戻り値:
- 読み込まれる32ビットのint値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readLong
public long readLong() throws IOException64ビットのlongを読み込みます。- 定義:
readLong
、インタフェース:DataInput
- 戻り値:
- 読み込まれる64ビットのlong値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readFloat
public float readFloat() throws IOException32ビットのfloatを読み込みます。- 定義:
readFloat
、インタフェース:DataInput
- 戻り値:
- 読み込まれる32ビットのfloat値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readDouble
public double readDouble() throws IOException64ビットのdoubleを読み込みます。- 定義:
readDouble
、インタフェース:DataInput
- 戻り値:
- 読み込まれる64ビットのdouble値。
- 例外:
EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readFully
public void readFully(byte[] buf) throws IOExceptionバイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。- 定義:
readFully
、インタフェース:DataInput
- パラメータ:
buf
- データの読込み先のバッファ- 例外:
NullPointerException
-buf
がnull
である場合。EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
readFully
public void readFully(byte[] buf, int off, int len) throws IOExceptionバイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。- 定義:
readFully
、インタフェース:DataInput
- パラメータ:
buf
- データの読込み先のバッファoff
- データ配列buf
への開始オフセットlen
- 読み込む最大バイト数- 例外:
NullPointerException
-buf
がnull
である場合。IndexOutOfBoundsException
-off
が負の値の場合、len
が負の値の場合、あるいはlen
がbuf.length - off
より大きい場合EOFException
- ファイルの終わりに達した場合。IOException
- ほかの入出力エラーが発生した場合。
-
skipBytes
public int skipBytes(int len) throws IOExceptionバイトをスキップします。- 定義:
skipBytes
、インタフェース:DataInput
- パラメータ:
len
- スキップするバイト数- 戻り値:
- 実際にスキップされたバイト数。
- 例外:
IOException
- 入出力エラーが発生した場合。
-
readLine
@Deprecated public String readLine() throws IOException非推奨。このメソッドはバイトを正確に文字に変換しません。詳細および代替メソッドについてはDataInputStreamを参照してください。\n、\r、\r\n、またはEOFで終了する行を読み込みます。- 定義:
readLine
、インタフェース:DataInput
- 戻り値:
- 行の文字列のコピー。
- 例外:
IOException
- ベースとなるInputStream
の読込み中に入出力エラーが発生した場合
-
readUTF
public String readUTF() throws IOException修正UTF-8形式の文字列を読み込みます。- 定義:
readUTF
、インタフェース:DataInput
- 戻り値:
- 文字列。
- 例外:
IOException
- ベースとなるInputStream
の読込み中に入出力エラーが発生した場合UTFDataFormatException
- 読込みバイトが、有効な修正UTF-8形式でエンコードされた文字列以外であった場合
-
getObjectInputFilter
public final ObjectInputFilter getObjectInputFilter()このストリームの直列化フィルタを返します。 直列化フィルタは、setObjectInputFilter
に設定された最新のフィルタ、またはObjectInputFilter.Config.getSerialFilter
からのシステム全体の初期フィルタです。- 戻り値:
- ストリームの直列化フィルタnullの場合がある
- 導入されたバージョン:
- 9
-
setObjectInputFilter
public final void setObjectInputFilter(ObjectInputFilter filter)ストリームの直列化フィルタを設定します。 フィルタcheckInput
メソッドは、ストリーム内の各クラスおよび参照に対して呼び出されます。 フィルタは、クラス、配列の長さ、参照の数、グラフの深さ、および入力ストリームのサイズのいずれかまたはすべてをチェックできます。 深さは、直列化復元されるグラフのルートの読み込みから始まり、現在のオブジェクトを直列化復元しているネストされたreadObject呼び出しの数です。 参照の数は、現在のオブジェクトが読み込まれていることを含めて、ストリームからすでに読み込まれたオブジェクトへの参照および累積数です。 このフィルタは、ストリームからオブジェクトを読み込むときとプリミティブでないときにのみ呼び出されます。フィルタが
Status.REJECTED
、null
を返すか、RuntimeException
をスローすると、アクティブなreadObject
またはreadUnshared
がInvalidClassException
をスローします。そうでない場合は、直列化復元は中断されません。ObjectInputStream
が構築されたときに、直列化フィルタはObjectInputFilter.Config.getSerialFilter
の値に初期化され、カスタム・フィルタに一度しか設定できません。 フィルタは、ストリームからオブジェクトを読み取る前に設定する必要があります。たとえば、readObject()
またはreadUnshared()
をコールします。- 実装要件:
- ストリーム内の各オブジェクト(レギュラまたはクラス)に対して、
null
ではなく、フィルタがreadObject
およびreadUnshared
の間に呼び出されます。 文字列はプリミティブとして扱われ、フィルタは呼び出されません。 フィルタは次の目的で呼び出されます:- 各オブジェクト参照はストリーム(クラスは
null
、arrayLengthは -1)から以前に直列化復元され、 - 各正規のクラス(クラスは
null
ではなく、arrayLengthは -1です。)、 - 動的プロキシの各インタフェースと動的プロキシ・クラス自体(クラスは
null
ではなく、arrayLengthは -1です。)、 - 各配列は、配列の型と長さ(classは配列型、arrayLengthはリクエストされた長さです)を使用してフィルタリングされ、
- クラスの
readResolve
メソッドで置き換えられた各オブジェクトは、null
ではなく、置換オブジェクト・クラスを使用してフィルタリングされ、配列の場合はarrayLength、そうでない場合は -1、 resolveObject
で置き換えられた各オブジェクトは、null
でない場合は置換オブジェクト・クラスを使用してフィルタリングされ、配列の場合はarrayLength、そうでない場合は -1にフィルタリングされます。
checkInput
メソッドが呼び出されると、現在のクラス、配列の長さ、ストリームからすでに読み込まれている参照の現在の数、readObject
またはreadUnshared
へのネストされた呼び出しの深さ、および実装の依存バイト数入力ストリーム。readObject
またはreadUnshared
を呼び出すごとに、オブジェクトを読み込む前に深さが1ずつ増加し、通常または例外的に戻る前に1ずつ減少します。 深さは1
から始まり、各ネストされたオブジェクトに対して増加し、各ネストされたコールが戻ると減少します。 ストリーム内の参照数は1
から始まり、オブジェクトを読み取る前に増加します。 - 各オブジェクト参照はストリーム(クラスは
- パラメータ:
filter
- フィルタはnullの場合があります- 例外:
SecurityException
- セキュリティ・マネージャが存在し、SerializablePermission("serialFilter")
が付与されていない場合IllegalStateException
- 「現在のフィルタ」がnull
ではなく、システム全体のフィルタでもない場合、またはオブジェクトが読み取られた場合- 導入されたバージョン:
- 9
-