クラスObjectInputStream
- すべての実装されたインタフェース:
Closeable,DataInput,ObjectInput,ObjectStreamConstants,AutoCloseable
警告: 信頼できないデータの直列化復元は、本質的に危険であり、回避する必要があります。 「Java SEに対するセキュア・コーディングのガイドライン」の"直列化および直列化復元"セクションに従って、信頼できないデータを慎重に検証する必要があります。 「直列化フィルタリング」では、シリアル・フィルタの使いやすさに関するベスト・プラクティスについて説明します。
直列化復元攻撃を無効にするキーは、任意のクラスのインスタンスが直列化復元されないようにし、そのメソッドの直接または間接的な実行を防ぐことです。 ObjectInputFilterはフィルタの使用方法を示し、ObjectInputFilter.Configはフィルタおよびフィルタ・ファクトリの構成方法を示します。 各ストリームには、直列化復元中にクラスおよびリソース制限をチェックするオプションの直列化復元フィルタがあります。 JVM全体のフィルタ・ファクトリにより、ObjectInputStreamごとにフィルタを設定でき、ストリームから読み取られるすべてのオブジェクトをチェックできます。 「ObjectInputStreamコンストラクタ」は、setObjectInputFilter(java.io.ObjectInputFilter)によって更新または置換される初期フィルタを選択するために、フィルタ・ファクトリを起動します。
ObjectInputStreamにフィルタがある場合、ObjectInputFilterでは、クラス、配列の長さ、ストリーム内の参照数、深さおよび入力ストリームから消費されたバイト数が許可され、そうでない場合には、直列化復元を終了できます。
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の例で記述されたストリームから読み取る場合:
try (FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis)) {
String label = (String) ois.readObject();
LocalDateTime dateTime = (LocalDateTime) ois.readObject();
// Use label and dateTime
} catch (Exception ex) {
// handle exception
}
クラスは、インタフェースjava.io.Serializableまたはjava.io.Externalizableを実装することによって、クラスがどのように直列化されるかを制御します。
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にキャッチされ、読込み処理を異常終了させます。
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
- 外部仕様
- 関連項目:
-
ネストされたクラスのサマリー
ネストされたクラス -
フィールドのサマリー
インタフェース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 -
コンストラクタのサマリー
コンストラクタ修飾子コンストラクタ説明protectedObjectInputStreamを完全に再実装するサブクラスが、ObjectInputStreamのこの実装によって使用されたばかりのprivateデータを割り当てる必要がないようにする手段を提供します。指定されたInputStreamから読み込むObjectInputStreamを作成します。 -
メソッドのサマリー
修飾子と型メソッド説明intブロックせずに読み込むことができるバイト数を返します。voidclose()この入力ストリームを閉じて、そのストリームに関連するすべてのシステム・リソースを解放します。void現在のクラスの非staticおよび非transientフィールドを、このストリームから読み込みます。protected booleanenableResolveObject(boolean enable) ストリームから読み取られたオブジェクトの置換をストリームで実行できるようにします。final ObjectInputFilterこのストリームの直列化復元フィルタを返します。intread()データのバイトを読み込みます。intread(byte[] buf, int off, int len) バイト配列に読み込みます。booleanbooleanを読み込みます。bytereadByte()8ビットbyteを読み取ります。charreadChar()16ビットcharを読み取ります。protected ObjectStreamClass直列化ストリームからクラス記述子を読み込みます。double64ビットdoubleを読み取ります。ストリームから持続フィールドを読み込み、名前を指定してそれらにアクセスできるようにします。float32ビットfloatを読み取ります。voidreadFully(byte[] buf) バイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。voidreadFully(byte[] buf, int off, int len) バイトを読み込みます。すべてのバイトが読み込まれるまでブロックします。intreadInt()32ビットintを読み取ります。readLine()非推奨。このメソッドは、バイトを文字に正しく変換しません。longreadLong()64ビットlongを読み取ります。final ObjectObjectInputStreamからオブジェクトを読み込みます。protected Objectこのメソッドは、引数なしのprotectedコンストラクタを使用して、ObjectInputStreamを構築したObjectInputStreamの信頼できるサブクラスによって呼び出されます。short16ビットshortを読み取ります。protected voidサブクラスが自身のストリーム・ヘッダーの読み込みと検証を行えるようにするために提供されています。ObjectInputStreamから「共有されない」オブジェクトを読み込みます。int符号なし8ビットbyteを読み取ります。int符号なしの16ビットshortを読み取ります。readUTF()修正UTF-8形式の文字列を読み込みます。voidregisterValidation(ObjectInputValidation obj, int prio) オブジェクト・グラフが返される前に検証されるべきオブジェクトを登録します。protected Class<?> 指定されたストリーム・クラスの記述に対応するローカル・クラスをロードします。protected ObjectresolveObject(Object obj) このメソッドは、直列化復元の際に、ObjectInputStreamの信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。protected Class<?> resolveProxyClass(String[] interfaces) プロキシ・クラス記述子で指定されたインタフェースを実装するプロキシ・クラスを返します。サブクラスはこのメソッドを実装してダイナミック・プロキシ・クラスの記述子とともにストリームからカスタム・データを読み込み、インタフェースやプロキシ・クラスの代替ローディング・メカニズムを使用できるようにします。final voidストリームの直列化復元フィルタを設定します。intskipBytes(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がヘッダーを書き込んでフラッシュするまでブロックします。コンストラクタは、現在のフィルタに
nullを指定してObjectInputFilter.Config.getSerialFilterFactory()から返されたシリアル・フィルタ・ファクトリを起動し、リクエストされたフィルタに「静的JVM全体のフィルタ」を起動して、戻されるフィルタに直列化復元フィルタを初期化します。 シリアル・フィルタまたはシリアル・フィルタ・ファクトリ・プロパティが無効な場合は、IllegalStateExceptionがスローされます。 フィルタ・ファクトリのapplyメソッドが呼び出されると、ObjectInputStreamを構築できない実行時例外がスローされる場合があります。- パラメータ:
in- 読込み元の入力ストリーム- スロー:
StreamCorruptedException- ストリーム・ヘッダーが不正な場合IOException- ストリーム・ヘッダーの読込み中に入出力エラーが発生した場合IllegalStateException- シリアル・フィルタまたはシリアル・フィルタ・ファクトリ・プロパティが無効であるため、ObjectInputFilter.Configの初期化に失敗した場合。NullPointerException-inがnullである場合- 関連項目:
-
ObjectInputStream
protected ObjectInputStream() throws IOExceptionObjectInputStreamを完全に再実装するサブクラスが、ObjectInputStreamのこの実装によって使用されたばかりのprivateデータを割り当てる必要がないようにする手段を提供します。コンストラクタは、現在のフィルタに
nullを指定してObjectInputFilter.Config.getSerialFilterFactory()から返されたシリアル・フィルタ・ファクトリを起動し、リクエストされたフィルタに「静的JVM全体のフィルタ」を起動して、戻されるフィルタに直列化復元フィルタを初期化します。 シリアル・フィルタまたはシリアル・フィルタ・ファクトリ・プロパティが無効な場合は、IllegalStateExceptionがスローされます。 フィルタ・ファクトリのapplyメソッドが呼び出されると、ObjectInputStreamを構築できない実行時例外がスローされる場合があります。- スロー:
IOException- このストリームの作成中に入出力エラーが発生した場合IllegalStateException- シリアル・フィルタまたはシリアル・フィルタ・ファクトリ・プロパティが無効であるため、ObjectInputFilter.Configの初期化に失敗した場合。
-
-
メソッドの詳細
-
readObject
public final Object readObject() throws IOException, ClassNotFoundExceptionObjectInputStreamからオブジェクトを読み込みます。 オブジェクトのクラス、クラスのシグネチャ、クラスの非transientフィールドおよび非staticフィールドの値とそのすべてのスーパー・タイプが読み込まれます。 writeObjectメソッドとreadObjectメソッドを使用すると、クラスのデフォルト直列化復元をオーバーライドできます。 このオブジェクトによって参照されるオブジェクトは中間的に読み込まれ、それによって、完全に同等なオブジェクト・グラフがreadObjectによって再構築されます。ルート・オブジェクトは、参照するフィールドとオブジェクトのすべてが復元された時、完全に復元されます。 この時点で、それらの登録された優先順位に基づいて、オブジェクト検証コールバックが実行されます。 このコールバックは、(特別なreadObjectメソッドの)オブジェクトによって、それらが個別に復元されるときに登録されます。
直列化復元フィルタは、
nullでない場合、ルート・オブジェクトを再構築するために各オブジェクト(レギュラまたはクラス)読取りに対して呼び出されます。 詳細については、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
- 関連項目:
-
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- コールバックの順序を制御します。デフォルトはゼロです。 早くコールバックする場合は大きい番号を、あとでコールバックする場合は小さい番号を使う。 同じ優先順位内では、コールバックの処理に特別な順序はない。- スロー:
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
- 関連項目:
-
resolveObject
protected Object resolveObject(Object obj) throws IOException このメソッドは、直列化復元の際に、ObjectInputStreamの信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 オブジェクトの置換は、enableResolveObjectが呼び出されるまでは行えません。 enableResolveObjectメソッドは、オブジェクトの解決を要求しているストリームが信頼できるかどうかを調べます。 直列化可能オブジェクトへのすべての参照は、resolveObjectに渡されます。 オブジェクトのプライベート状態が意図せず、信頼できるストリームのみが公開されないようにするには、resolveObjectを使用できます。このメソッドは、オブジェクトが読み込まれたあと、readObjectから復帰する前に呼び出されます。 デフォルトのresolveObjectメソッドは、同じオブジェクトを返します。
サブクラスがオブジェクトを置換する場合、置換されたオブジェクトが、参照が格納されるすべてのフィールドと互換性があることを確認する必要があります。 型がフィールドまたは配列要素の型のサブクラスでないオブジェクトは、例外を生成して直列化復元を中止し、オブジェクトの格納されません。
このメソッドは、各オブジェクトが最初に検出されたときに1回だけ呼び出されます。 これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。
- パラメータ:
obj- 置換されるオブジェクト- 戻り値:
- 置換されたオブジェクト
- スロー:
IOException- 通常の入出力関連の例外が発生した場合。
-
enableResolveObject
protected boolean enableResolveObject(boolean enable) ストリームから読み取られたオブジェクトの置換をストリームで実行できるようにします。 有効にすると、直列化復元されるすべてのオブジェクトに対してresolveObject(java.lang.Object)メソッドがコールされます。- パラメータ:
enable- 直列化復元される各オブジェクトについてresolveObjectの使用を有効にする場合はtrue- 戻り値:
- このメソッドが呼び出される前の設定
-
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
- 関連項目:
-
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- 転送先配列の開始オフセットbuflen- 読み込まれる最大バイト数- 戻り値:
- バッファに読み込まれたバイトの合計数。ストリームの終わりに達してデータがない場合は
-1。 - スロー:
NullPointerException-bufがnullの場合。IndexOutOfBoundsException-offが負の場合、lenが負の場合、またはlenがbuf.length - offより大きい場合。IOException- 入出力エラーが発生した場合。- 関連項目:
-
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ビットbyteを読み取ります。- 定義:
readByte、インタフェースDataInput- 戻り値:
- 8ビットのbyteの読み取り。
- スロー:
EOFException- ファイルの終わりに達した場合。IOException- ほかの入出力エラーが発生した場合。
-
readUnsignedByte
public int readUnsignedByte() throws IOException符号なし8ビットbyteを読み取ります。- 定義:
readUnsignedByte、インタフェースDataInput- 戻り値:
- 8ビットのbyteの読み取り。
- スロー:
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ビットのintegerの読み取り。
- スロー:
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()このストリームの直列化復元フィルタを返します。 フィルタは、constructorまたはsetObjectInputFilterの最新起動によるJVM-wide filter factoryの起動結果です。- 戻り値:
- ストリームの直列化復元フィルタ。nullの場合があります
- 導入されたバージョン:
- 9
-
setObjectInputFilter
public final void setObjectInputFilter(ObjectInputFilter filter) ストリームの直列化復元フィルタを設定します。 直列化復元フィルタは、current filterおよびfilterパラメータを使用して「JVM全体のフィルタ・ファクトリ」を起動することで返されるフィルタに設定されます。 現在のフィルタは、「JVM全体のフィルタ・ファクトリ」を呼び出して「ObjectInputStreamコンストラクタ」に設定されており、nullである可能性があります。setObjectInputFilter(ObjectInputFilter)このメソッド} は、ストリームからオブジェクトを読み取る前に一度だけ呼び出すことができます(たとえば、readObject()またはreadUnshared()を呼び出します)。non-nullフィルタをnullフィルタに置換することはできません。 current filterがnon-nullの場合、フィルタ・ファクトリから返される値はnon-nullである必要があります。フィルタの
checkInputメソッドは、ストリーム内のクラスおよび参照ごとにコールされます。 フィルタは、クラスの一部またはすべて、配列の長さ、参照数、グラフの深さ、および入力ストリームのサイズをチェックできます。 深さは、直列化復元されるグラフのルートの読取りおよび直列化復元される現在のオブジェクトの読取りから始まる、ネストされたreadObjectコールの数です。 参照の数は、読み込まれている現在のオブジェクトを含む、ストリームからすでに読み取られているオブジェクトおよび参照の累積数です。 フィルタは、プリミティブではなく、ストリームからオブジェクトを読み取る場合にのみ呼び出されます。フィルタが
Status.REJECTED、nullを返すか、RuntimeExceptionをスローする場合、アクティブなreadObjectまたはreadUnsharedはInvalidClassExceptionをスローします。それ以外の場合、直列化復元は中断されずに続行されます。- 実装要件:
- フィルタ(
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の場合があります- スロー:
IllegalStateException- オブジェクトが読み取られた場合、current filterがnullでないときにフィルタ・ファクトリがnullを返すか、フィルタがすでに設定されている場合。- 導入されたバージョン:
- 9
-