ISerializable インターフェイス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
クラスのシリアル化可能性は、java を実装するクラスによって有効になります。
[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 派生
- 属性
- 実装
注釈
クラスのシリアル化可能性は、java.io.Serializable インターフェイスを実装するクラスによって有効になります。
<強い>警告: 信頼されていないデータの逆シリアル化は本質的に危険であり、避ける必要があります。 信頼されていないデータは慎重に検証する必要があります。 </strong>
このインターフェイスを実装しないクラスの状態はシリアル化または逆シリアル化されません。 シリアル化可能なクラスのすべてのサブタイプは、それ自体がシリアル化可能です。 シリアル化インターフェイスにはメソッドやフィールドがなく、シリアル化可能なセマンティクスを識別するためだけに機能します。
シリアル化できないクラスのサブタイプをシリアル化できるようにするために、サブタイプは、スーパータイプのパブリック、プロテクト、および (アクセス可能な) パッケージ フィールドの状態を保存および復元する責任を負う場合があります。 サブタイプは、拡張するクラスに、クラスの状態を初期化するためのアクセス可能な引数なしのコンストラクターがある場合にのみ、この責任を負う可能性があります。 そうでない場合は、Serializable クラスを宣言するとエラーになります。 エラーは実行時に検出されます。
逆シリアル化中、シリアル化できないクラスのフィールドは、クラスのパブリックコンストラクターまたは保護された引数なしのコンストラクターを使用して初期化されます。 引数なしのコンストラクターには、シリアル化可能なサブクラスからアクセスできる必要があります。 シリアル化可能なサブクラスのフィールドはストリームから復元されます。
グラフを走査するときに、シリアル化可能なインターフェイスをサポートしていないオブジェクトが発生する可能性があります。 この場合、NotSerializableException がスローされ、シリアル化不可能なオブジェクトのクラスが識別されます。
シリアル化および逆シリアル化プロセス中に特別な処理を必要とするクラスは、次の厳密なシグネチャを持つ特別なメソッドを実装する必要があります。
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
writeObject メソッドは、対応する readObject メソッドがオブジェクトを復元できるように、その特定のクラスのオブジェクトの状態を書き込みます。 オブジェクトのフィールドを保存するための既定のメカニズムは、out.defaultWriteObject を呼び出すことによって呼び出すことができます。 このメソッドは、スーパークラスまたはサブクラスに属する状態に関係する必要はありません。 状態は、writeObject メソッドを使用して ObjectOutputStream に個々のフィールドを書き込むか、DataOutput でサポートされているプリミティブ データ型のメソッドを使用して保存されます。
readObject メソッドは、ストリームからの読み取りとクラス フィールドの復元を担当します。 in.defaultReadObject を呼び出して、オブジェクトの非静的フィールドと非一時的フィールドを復元するための既定のメカニズムを呼び出すことができます。 defaultReadObject メソッドは、ストリーム内の情報を使用して、ストリームに保存されているオブジェクトのフィールドに、現在のオブジェクト内の対応する名前付きフィールドを割り当てます。 これにより、クラスが新しいフィールドを追加するように進化した場合のケースが処理されます。 このメソッドは、スーパークラスまたはサブクラスに属する状態に関係する必要はありません。 状態は、個々のフィールドの ObjectInputStream からデータを読み取り、オブジェクトの適切なフィールドに割り当てることによって復元されます。 プリミティブ データ型の読み取りは、DataInput でサポートされています。
readObjectNoData メソッドは、シリアル化ストリームが指定されたクラスを逆シリアル化されるオブジェクトのスーパークラスとして一覧表示しない場合に、その特定のクラスのオブジェクトの状態を初期化します。 これは、受信側が逆シリアル化されたインスタンスのクラスのバージョンが送信側と異なるバージョンを使用し、受信側のバージョンが送信者のバージョンによって拡張されていないクラスを拡張する場合に発生する可能性があります。 これは、シリアル化ストリームが改ざんされた場合にも発生する可能性があります。そのため、readObjectNoData は、"敵対的" または不完全なソース ストリームにもかかわらず、逆シリアル化されたオブジェクトを適切に初期化するのに役立ちます。
ストリームにオブジェクトを書き込むときに使用する代替オブジェクトを指定する必要があるシリアル化可能なクラスでは、厳密なシグネチャを使用してこの特殊なメソッドを実装する必要があります。
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
この writeReplace メソッドは、メソッドが存在し、シリアル化されるオブジェクトのクラス内で定義されたメソッドからアクセスできる場合に、シリアル化によって呼び出されます。 したがって、メソッドはプライベート、保護、およびパッケージ プライベート アクセスを持つことができます。 このメソッドへのサブクラスアクセスは、Javaアクセシビリティルールに従います。
ストリームからインスタンスを読み取るときに置換を指定する必要があるクラスは、厳密なシグネチャを持つこの特別なメソッドを実装する必要があります。
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
この readResolve メソッドは、writeReplace と同じ呼び出し規則とアクセシビリティ規則に従います。
シリアル化ランタイムは、シリアル化可能な各クラスにバージョン番号を関連付けます。serialVersionUID と呼ばれるバージョン番号は、シリアル化時に使用され、シリアル化されたオブジェクトの送信側と受信側がシリアル化に対応するそのオブジェクトのクラスを読み込んだかどうかを確認するために使用されます。 受信側が、対応するセンダーのクラスとは異なる serialVersionUID を持つオブジェクトのクラスを読み込んだ場合、逆シリアル化は InvalidClassException
. シリアル化可能なクラスは、静的、最終、および型long
である必要がある名前"serialVersionUID"
のフィールドを宣言することで、独自の serialVersionUID を明示的に宣言できます。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
シリアル化可能なクラスが serialVersionUID を明示的に宣言しない場合、シリアル化ランタイムは、Java(TM) オブジェクトシリアル化仕様で説明されているように、クラスのさまざまな側面に基づいて、そのクラスの既定の serialVersionUID 値を計算します。 ただし、シリアル化可能なすべてのクラスで <>serialVersionUID 値が明示的に宣言されることを強くお勧めします<>。これは、既定の serialVersionUID 計算は、コンパイラの実装によって異なる可能性があり、逆シリアル化中に予期しない InvalidClassException
s が発生する可能性があるためです。 したがって、異なる Java コンパイラ実装間で一貫した serialVersionUID 値を保証するには、シリアル化可能なクラスで明示的な serialVersionUID 値を宣言する必要があります。 また、明示的な serialVersionUID 宣言では可能な限り修飾子を private
使用することを強くお勧めします。このような宣言は、すぐに宣言する class--serialVersionUID フィールドにのみ適用されるため、継承されたメンバーとしては役に立ちません。 配列クラスは明示的な serialVersionUID を宣言できないため、常に既定の計算値が使用されますが、配列クラスでは serialVersionUID 値の照合の要件は免除されます。
android N を対象としている場合、一部のクラスでは、serialVersionUID 計算の Android 実装が若干変更されます。互換性を維持するために、この変更は、アプリケーション ターゲット SDK のバージョンが 24 以上に設定されている場合にのみ有効になります。 互換性の問題を回避するために、明示的な serialVersionUID フィールドを使用することを強くお勧めします。
<h3>シリアル化可能な Judiciously</h3> を実装する シリアル化 API の完全なカバレッジについては、シリアル化に関する有効な Java の章を参照してください。 この本では、アプリケーションの保守容易性を損なうことなく、このインターフェイスを使用する方法について説明します。
<h3>Recommended Alternatives</h3><strong>JSON</strong> は簡潔で、人間が判読でき、効率的です。 Android には、JSON の android.util.JsonReader streaming API
読み取りと org.json.JSONObject tree API
書き込みの両方が含まれています。 GSON などのバインド ライブラリを使用して、Java オブジェクトを直接読み書きします。
1.1 で追加されました。
の Java ドキュメントjava.io.Serializable
このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。
プロパティ
Handle |
基になる Android オブジェクトの JNI 値を取得します。 (継承元 IJavaObject) |
JniIdentityHashCode |
ラップされたインスタンスの |
JniManagedPeerState |
マネージド ピアの状態。 (継承元 IJavaPeerable) |
JniPeerMembers |
メンバー アクセスと呼び出しのサポート。 (継承元 IJavaPeerable) |
PeerReference |
ラップされた Java オブジェクト インスタンスの a JniObjectReference を返します。 (継承元 IJavaPeerable) |
メソッド
Disposed() |
インスタンスが破棄されたときに呼び出されます。 (継承元 IJavaPeerable) |
DisposeUnlessReferenced() |
このインスタンスへの未処理の参照がない場合は、呼び出 |
Finalized() |
インスタンスが終了したときに呼び出されます。 (継承元 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
によって |
SetJniManagedPeerState(JniManagedPeerStates) |
クラスのシリアル化可能性は、java を実装するクラスによって有効になります。 (継承元 IJavaPeerable) |
SetPeerReference(JniObjectReference) |
によって |
UnregisterFromRuntime() |
ランタイムが将来 Java.Interop.JniRuntime+JniValueManager.PeekValue の呼び出しから返されないように、このインスタンスの登録を解除します。 (継承元 IJavaPeerable) |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
クラスのシリアル化可能性は、java を実装するクラスによって有効になります。 |
GetJniTypeName(IJavaPeerable) |
クラスのシリアル化可能性は、java を実装するクラスによって有効になります。 |