0

私は現在、シリアル化可能なクラス ClientRepository を持つプロジェクトを書いています。クラスは serialVersionUID を指定しません。プログラムを実行しようとすると、次の例外が発生しました。

Exception in thread "main" java.io.InvalidClassException: ClientRepository; local class incompatible: stream classdesc serialVersionUID = -477189107700903771, local class serialVersionUID = -3576242897222506440

だから私はデフォルトのserialVersionUID(1L)を追加しましたが、今は

Exception in thread "main" java.io.InvalidClassException: ClientRepository; local class incompatible: stream classdesc serialVersionUID = -477189107700903771, local class serialVersionUID = 1

「ストリームclassdesc serialVersionUID」を1Lに変更して、競合しないようにするにはどうすればよいですか?

ありがとう!

4

2 に答える 2

3

データを変更しようとしないでください。代わりに、クラスがまだ古いバージョンと互換性があることが確実な場合 (そして、1 つのバージョンだけがデータを公開している場合) は、値と一致するように宣言を -477189107700903771L に変更しますserialVersionUID。データで。値は任意です。データの内容と一致する必要があります。

もちろん、クラスが互換性のない方法で変更された場合は、カスタムのシリアライゼーション コードを記述する必要があります。

個人的には、これらのもろさの理由から、このようなネイティブ バイナリ シリアライゼーションを避けようとしています。Protocol Buffersなどの代替手段を検討することをお勧めします。

于 2014-05-16T12:40:12.743 に答える
1

問題はおそらく、追加する前にリポジトリにシリアライズされたオブジェクト serialVersionUID = 1Lです1L。リポジトリをパージする必要があります。

于 2014-05-16T12:40:16.160 に答える