シリアル化は、オブジェクトの状態をバイトストリームに変換するメカニズムです。 直列化復元するものである場合、バイトストリームで再現し、実際のJavaオブジェクト。 このメカニズムの使用を永続オブジェクトです。
作成されるバイトストリームはプラットフォームに依存しません。 なので、オブジェクト直列化されたひとつのプラットフォームでの直列化復元が異なる。,
Javaオブジェクトを直列化可能にするために、java.io.Serializableインタフェースを実装します。
ObjectOutputStreamクラスには、オブジェクトをシリアル化するwriteObject()メソッドが含まれています。
public final void writeObject(Object obj) throws IOException
ObjectInputStreamクラスには、オブジェクトを逆シリアル化するためのreadObject()メソッドが含まれています。
public final Object readObject() throws IOException, ClassNotFoundException
シリアル化の利点
1. オブジェクトの状態を保存/永続化する。
2. ネットワーク経由でオブジェクトを移動する。
java.io.Serializableインタフェースを実装しているこれらのクラスのオブジェクトのみを直列化できます。,
直列化可能であるマーカーインタフェース(データメンバと法です。 で”マーク”javaクラスでこれらのクラスのオブジェがある。 マーカーインターフェイスの他の例は次のとおりです。
覚えておくべきポイント
1. 親クラスがSerializableインターフェイスを実装している場合、子クラスはそれを実装する必要はありませんが、その逆もまた同様です。
2. 非静的データメンバのみが直列化プロセスによって保存されます。
3. 静的データメンバーとの過渡的なデータメンバーに保存されません経由で直列化です。,したがって、非静的データメンバーの値を保存したくない場合は、一時的にします。
4. コンストラクタのオブジェクトがないときに呼び出されるオブジェクトが直列化復元.
5. れに関連したオブジェクトを必ず実施Serializableインタフェース。
例:
class A implements Serializable{// B also implements Serializable// interface.B ob=new B(); }
SerialVersionUID
シリアライズランタイムは、SerialVersionUIDと呼ばれる各シリアライズ可能クラスにバージョン番号を関連付けます。Serialization中に、シリアライズされたオブジェクトの送信者と受信者がシリアライズに関して互換性のあるそのオブジェクトのクラスをロードしていることを確認するために使用されます。, 受信者が、対応する送信者のクラスとは異なる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修飾子を使用することも推奨されます。
serialver
serialverはJDKに付属のツールです。 これは、javaクラスのserialVersionUID番号を取得するために使用されます。,
次のコマンドを実行してserialVersionUIDを取得できます
serialver
例1:
出力:
Object has been serializedObject has been deserialized a = 1b = geeksforgeeks
例2:
出力:
Object has been serializedData before Deserialization.name = abage = 20a = 2b = 1000Object has been deserializedData after Deserialization.name = abage = 20a = 0b = 2000
出力の説明:
オブジェクトのデシリアライズ中にaとbの値が変更されていることがわかりました。 Aである理由は過渡としてマークされ、bは静的であった。,
過渡変数の場合:-過渡キーワードで定義された変数は、シリアライズ処理中にシリアライズされません。この変数は、逆シリアル化の際にデフォルト値で初期化されます。 (たとえば、オブジェクトの場合はnull、intの場合は0です)。
静的変数の場合:-staticキーワードで定義された変数は、直列化プロセス中に直列化されません。この変数には、逆シリアル化の際にクラスで定義された現在の値がロードされます。
この記事はMehak NarangとShubham Junejaによって寄稿されています。, GeeksforGeeksが好きで、貢献したい場合は、以下を使用して記事を書くこともできますcontribute.geeksforgeeks.org またはあなたの記事を郵送する[email protected]のメインページに表示されるあなたの記事を参照してくださいし、他のオタクを助けます.
間違ったものが見つかった場合、または上記のトピックについての詳細を共有したい場合は、コメントを書いてください。
注目リーダー! 今学習を停止しないでください。, 学生に優しい価格でJavaおよびJavaコレクションの基礎コースですべての重要なJava FoundationおよびCollectionsの概念を手に入れ、業界の準備ができているようになります。