3

私はしばらくの間、私の小さなペット プロジェクトのシリアル化可能なインターフェイスをいじっていましたが、 static final long をどのように定義する必要があるかについての警告によく気付きますserialVersionID

私は、独自のインターフェイスで同様の警告を生成する方法を探していました (それを実装するクラスで定数の宣言を強制/推奨します) が、これまでのところ何も見つかりませんでした。インターフェイスは単なるマーカー インターフェイスであるため、実際には何も含まれていません。Seralizable私の質問に最も近いのは、dreamincode のこのスレッドです

それは非常に便利な機能のように聞こえるので、誰か助けてもらえますか?

4

2 に答える 2

0

最も簡単なのは、単に値を宣言することです。何かのようなもの:

private static final long serialVersionUID = 1L;

これを行う理由は、オブジェクトのシリアル化/逆シリアル化を制御するためです。を持たないクラスのインスタンスをシリアル化するserialVersionUIDと、システムは現在のクラス定義からインスタンスを生成します。クラスを重要な方法で変更すると、システムで生成されたIDが変更されます。これにより、古いIDでシリアル化されたオブジェクトを逆シリアル化できなくなります。

オブジェクトをシリアル化するが永続化しない場合は、IDを定義する必要はおそらくありません(コンパイラの警告を取り除くことを除いて)。

詳細については、このスレッドを参照してください。

于 2013-03-17T05:35:59.307 に答える
0

serialVersionID(フィールド)は、 Serializableインターフェイスのメンバーとして宣言されていません。フィールド名は単なる慣例であり、フィールドは実行時にリフレクションによってアクセスされます。インターフェイスを使用してフィールドコントラクトを定義することはできません。

警告は「コンパイラマジック」であり、そのようなフィールドを持たないSerializableを実装するタイプに遭遇したときに警告を発行する必要があることを認識しています。この警告動作は、アプリケーションコードだけで他のフィールドに対してエミュレートすることはできません。同様の警告を取得するには、目的のヒューリスティックを理解する[カスタマイズされた]コンパイラまたはlint/code-checkerを使用する必要があります。

于 2013-03-17T05:40:01.827 に答える