Wikipediaによると、直列化(または直列化)は、データ構造またはオブジェクト状態を保存(例えば、ファイルまたはメモリバッファに)または送信(例えば、ネットワーク接続リンクを介して)し、後で(おそらく別のコンピュータ環境で)再構築できる形式に変換するプロセスである。結果の一連のビットが直列化形式に従って再読み込みされると、元のオブジェクトの意味的に同一のクローンを作成するために使用できます。,

なので基本的に直列化はプロセスに変換するオブジェクトのバイトシーケンスできる持続的なディスクまたはデータベースまたは送信可能な通われている。 の逆過程をオブジェクトからのバイトシーケンスは直列化復元.
javaでのシリアル化と逆シリアル化
オブジェクトをファイルにシリアル化および逆シリアル化するには、ObjectOutputStream.writeObject()
およびObjectInputStream.readObject()
を呼び出す必要があります。,
クラスは、オブジェクトを正常に直列化するために、java.io
パッケージに存在する直列化可能なインターフェイスを実装する必要があります。 直列化可能であるマーカーインタフェースを追加する直列化可能でない行動の実装するクラスです。
Javaは、java.io
オブジェクトをシリアル化および逆シリアル化するためのパッケージ
java.io.serializable
java.io.Externalizable
ObjectInputStream
ObjectInputStream
li>およびObjectOutputStream
など。,

覚えておくべきポイント
1. 親クラスがSerializableインターフェイスを実装している場合、子クラスはそれを実装する必要はありませんが、その逆もまた同様です。
2. 非静的データメンバのみが直列化プロセスによって保存されます。
3. 静的データメンバーとの過渡的なデータメンバーに保存されません経由で直列化です。なので、かない場合には保存したい価値の非staticデータ参その一過性です
4., コンストラクタのオブジェクトがないときに呼び出されるオブジェクトが直列化復元.
5. れに関連したオブジェクトを必ず実施Serializableインタフェース。
SerialVersionUID
シリアル化ランタイムは、バージョン番号をSerialVersionUIDと呼ばれる各シリアル化可能クラスに関連付けます。Serial化解除の際に、シリアル化されたオブジェクトの送信者と受信者が、シリアル化に関して互換性のあるそのオブジェクトのクラスをロードしていることを確認します。, 受信側が、対応する送信側のクラスとは異なるUIDを持つオブジェクトのクラスをロードした場合、逆シリアル化によりInvalidClassExceptionが発生します。 直列化可能クラスは、フィールド名を宣言することにより、独自のUIDを明示的に宣言できます。
静的で、finalで、long型でなければなりません。
i.,e-ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;
serializableクラスがserialVersionUIDを明示的に宣言しない場合、直列化ランタイムは、Java Object Serialization Specificationで説明されているように、クラスのさまざまな側面に基づいて、そのクラスのデフォルトのデフォルトのデフォルトのデフォルトのデフォルトのものを計算します。 ただし、すべてのserializableクラスは、serialVersionUID値を明示的に宣言することを強くお勧めします。serialVersionUID値の計算は、コンパイラの実装によって異なる可能性があるクラス,
継承されたメンバーとしては役に立たないため、UIDにprivate修飾子を使用することも推奨されます。
過渡変数の場合:-transientキーワードで定義された変数は、シリアル化プロセス中にシリアル化されません。この変数は、逆シリアル化の際にデフォルト値で初期化されます。 (たとえば、オブジェクトの場合はnull、intの場合は0です)。
静的変数の場合:-staticキーワードで定義された変数は、直列化プロセス中に直列化されません。この変数には、逆シリアル化の際にクラスで定義された現在の値がロードされます。,
javaでのシリアル化
逆シリアル化
Contactフィールドは、静的としてマークされており、以前に説明したように静的フィールドがシリアル化されないため、Nullです。
注:静的メンバーは、クラスのオブジェクトではなくクラスに接続されているため、シリアル化されません。
- 直列化は、オブジェクトの状態を一連のバイトに保存するプロセスであり、ファイルに保存したり、ネットワーク経由で送信したりすることができ、逆直列化は、それらのバイトからオブジェクトを再構築するプロセスです。,
Serializable
インターフェイスのサブクラスのみをシリアル化できます。私たちのクラスがSerializable
インターフェイスを実装していない場合、または非Serializable
クラスへの参照を持っている場合、JVMはNotSerializableException
をスローします。- すべての
transient
およびstatic
フィールドはシリアル化されません。 serialVersionUID
は、シリアル化されたオブジェクトと逆シリアル化されたオブジェクトが同じ属性を持ち、逆シリアル化と互換性があることを確認する,- クラスに
serialVersionUID
フィールドを作成する必要がありますので、クラス構造を変更(フィールドの追加/削除)すると、JVMはInvalidClassException
。 それを提供しない場合、JVMはクラス構造が変更されたときに変更される可能性のあるものを提供します。writeObject
およびreadObject
メソッドの実装を提供することにより、Javaクラス内のデフォルトの直列化動作をオーバーライドできます。, - そして、
ObjectOutputStream.defaultWriteObject()
とObjectInputStream.defaultReadObject
からwriteObject
とreadObject
デフォルトのシリアル化と逆シリアル化ロジックを取得する - クラスをシリアル化または逆シリアル化したくない場合は、
NotSerializableException
writeObject
およびreadObject
から例外をスローできます。
Leave a Reply