5

私は次のクラス署名を持っており、ClientEventSourc実装していますSerializable

public class Grid extends ClientEventSource implements Focusable, FramingBlockWrapper,LIMSEditableField

FindBugsはこれを危険なものとしてリストしています:

クラスはSerializableですが、serialVersionUIDを定義していません

このクラスはSerializableインターフェイスを実装しますが、serialVersionUIDフィールドを定義しません。.classオブジェクトへの参照を追加するだけの簡単な変更は、クラスに合成フィールドを追加します。これにより、残念ながら暗黙のserialVersionUIDが変更されます(たとえば、String.classへの参照を追加すると、静的フィールドclass $ java $ lang$Stringが生成されます。 )。また、ソースコードとバイトコードのコンパイラが異なると、クラスオブジェクトまたは内部クラスへの参照用に生成された合成変数に異なる命名規則が使用される場合があります。バージョン間でSerializableの相互運用性を確保するには、明示的なserialVersionUIDを追加することを検討してください。

それが何を意味するのか、そしてこれを修正するための最良の方法は何であるかを説明できる人はいますか?

4

3 に答える 3

8

serialVersionUIDは、クラスを逆シリアル化するために使用されます。デフォルトでは自動生成されます。
ただし、クラス内の何かを変更すると、異なるserialVersionUIDが生成され、「古い」オブジェクトを逆シリアル化することはできません。
したがって、独自のserialVersionUIDを定義して、逆シリアル化が適切なクラスを見つけるのに役立てます。

次のような変数をコードに追加します。

private static final long serialVersionUID = 6106269076155338045L;

UIDの生成に関するリファレンス:

JavaでSerializableクラスを拡張するときに、serialVersionUIDに何を選択するかは重要ですか?

于 2012-08-09T10:46:26.477 に答える
3

それが何を意味するのか説明できますか

クラスへのマイナーな変更は、serialVersionUID正当な理由もなく逆シリアル化を防ぐことができるため、不要なものを変更します。

そしてこれを修正するための最良の方法は何ですか?

提案どおりに設定してください。

private static final long serialVersionUID = 1;

この番号を生成するアルゴリズム/プログラムはありますか

はい。これは、再作成ではなく、バイパスしようとしているアルゴリズムです。から始めて1ください。

つまり、それは何でもかまいませんし、特定のベストプラクティスに従う必要があります

1これが任意に選択されたオーバーライド値であることが明確になるため、使用がベストプラクティスであることをお勧めします。のような大きな値を使用する6106269076155338045Lと、生成された数値のように見えるか、理由のこの数値を選択できます。

于 2012-08-09T10:47:12.987 に答える
1

この値は、逆シリアル化で使用されます。その目的は、クラスとそれに対応するシリアル化されたオブジェクト間の互換性を維持することです。タイプのオブジェクトをシリアル化してから何らかの方法でA変更した場合、このメカニズムにより、オブジェクトを逆シリアル化できなくなります。Aオブジェクトとそのクラスが一致せず、ランタイムエラーが発生します。

serialver.exeJDKにあります。パラメータとしてファイルを指定する.classと、が吐き出されますserialVersionUID。ほとんどのIDEには、この機能が組み込まれています。

入力の例:

> serialver MyClass

(すでにファイルが存在し、実装する必要がMyClass.classあります)MyClassSerializable

出力例:

> MyClass: static final long serialVersionUID = -8174364448753809256L;

コマンドラインで何かをするのが嫌なら、次のようにプログラムを実行します。

> serialver -show

このGUIが表示されます。

シリアルバーのスクリーンショット

次に、クラスの名前を入力して、[表示]をクリックします。

興味があれば、シリアル化プロセスについて読むことをお勧めします。このバージョンIDが必要な理由、生成時に考慮されるフィールド/メソッドなどを正確に知ることができます。

于 2012-08-09T11:13:47.560 に答える