4

注: SO でこのような質問が不足しているため、Q&A として自分で質問することにしました。

オブジェクトのシリアル化 (ObjectOutputStreamおよびを使用ObjectInputStream) は、 のインスタンスをJava Objectデータとして保存し、後で使用するために逆シリアル化できる方法です。Classこれは、データの逆シリアル化に使用された が同じままでない場合 (ソースコードの変更、プログラムの更新)、問題とフラストレーションを引き起こす可能性があります。

では、更新/ダウングレードされたバージョンの をどのようObjectにシリアライズおよびデシリアライズできClassますか?

4

1 に答える 1

2

下位互換性のある方法で逆シリアル化できるオブジェクトをシリアル化する一般的な方法を次に示します。

1.インスタンスの再作成に必要なすべてのフィールドを保存するように設計されたメソッドを使用して、 JSON形式でデータを保存します。バージョンが低すぎる場合に更新アルゴリズムを呼び出すことができるキーを含めることで、これに後方互換性を持たせることができます。このための一般的なライブラリは、通常は JSON ファイルを編集するだけでなく、JSON で Java オブジェクトを表現できるGoogle Gsonライブラリです。importexportversion

2.上記の方法と同様の方法で、組み込みの Javaプロパティクラスを使用します。store()プロパティ オブジェクトは、通常の Java プロパティ ファイルとして記述されたストリーム ( ) を使用して後で格納するか、 XMLで保存する( storeToXML()) ことができます。

3.単純なオブジェクトは、JSON、XML、またはプロパティ ファイルに格納することが複雑すぎるか、または必要でない場所で、キーと値のペアで簡単に表すことができる場合があります (やり過ぎと言えます)。この場合、オブジェクトをシリアル化する効果的な方法は、ObjectOutputStreamクラスを使用して、キーが で、値が( )HashMapであるキーと値のペアを含むオブジェクトをシリアル化することです。これにより、多くの汎用性を提供しながら、オブジェクトのすべてのフィールドを保存できるだけでなく、キーを含めることができます。StringObjectHashMap<String,Object>version

注: for persistence ストレージを使用してオブジェクトをシリアル化することObjectOutputStreamは、通常は悪い規則と見なされますが、クラスのソース コードが同じままである限り、どちらの方法でも使用できます。

バージョニングについても注意してください:クラスへの変更は、互換性のある変更ObjectOutputStreamである限り、逆シリアル化を中断することなく安全に行うことができます。Object Serialization Specification の Versioning of Serializable Objects の章で説明されているように:

互換性のある変更とは、クラスとその呼び出し元の間の契約に影響を与えない変更です。

于 2013-07-28T23:47:24.897 に答える