1

私の組織では、出力ストリームを使用してオブジェクトを反復的に保存する、カスタムのシリアライゼーション手法を使用しています。次の問題が発生しています。

ParentChildクラスが実装しSerializableます。Parentクラスにはフィールドa,b,cがあり、Childクラスには がありeます。親のシリアライゼーションにフィールドを追加しdて更新したところ、古いクライアントがシリアライゼーション コードを正しくParent読み取れなくなりました。Childこれは、Childシリアル化コードが次のようになるためです。

OutputStream in = getCurrentOutStream();

current_serialization_num = readVersionNum(in) // The version num is similar to Java's UID and is updated when fields are added.
readParent(in)
e = readField(in)

シリアル化は を介し​​て行われるためDataOutputStream、優れた XML リーダーではこれを処理できません。私はこの問題に対する醜い解決策を持っていますが、それはまったくうまくいきません。そのため、それを紹介することで読者の心を汚染したくありません。ただし、他の人が同様の状況にどのように対処するかを本当に知りたいです。

4

2 に答える 2

1

古い親によって作成されたオブジェクトは、古い serialVersionUID によってシリアル化されました。新しいオブジェクトは、新しい serialVersionUID によってシリアル化されます。あなたがそれを実装している方法では、Child は古いオブジェクトと新しいオブジェクトを同時に読み取ることができません。

同じ serialVersionUID を持っている必要があります。コンパイラが文句を言う場合は、抑制注釈を付けます。同じオブジェクトであることをコンパイラに明確に伝えたい。

于 2012-07-20T19:25:19.380 に答える
1

わかりました、それが問題です。このクラスを使用してデータをシリアル化していることは理解していますが、これはクラス定義です。シリアライゼーションの問題ではありません。特定の方法でファイルを読み取るクラスを構築しましたが、現在は別の方法でファイルを構築しています。同じタイプのファイルではないため、「シリアル化」されません。あなたが言うなら:私はa、b、cのフィールドを持つファイルを作成し、このクラスは最初のフィールドをaとして、2番目のフィールドをbなどとして読み取ります。次に、ファイルをb、c、次にaで作成するように変更します。古いクラスは依然として「a」が最初であると考えており、そうすべきではない理由はありません。

于 2012-07-20T19:53:45.007 に答える