質問

なぜそうではないのですか serialVersionUID 自動的に生成されましたか?私は、明らかに古いクラスがキャッシュされているようです。

役に立ちましたか?

解決

SerialVersionUidは危険であるため、自動的に生成されません。 SerialVersionUidが設定されている場合、クラスの2つのバージョンがシリアル化に関して互換性があることを意味します。

Fooと呼ばれるクラスがあると想像してみてください SerialVersionUidはありません (デフォルト)、Fooのインスタンスをファイルにシリアル化します。後で、Fooクラスに新しいメンバーを追加します。ファイルからFOOオブジェクトをゆるくしようとすると、オブジェクトが互換性がないことを示すシリアル化障害が得られます。彼ら それは 相容れない、これは あなたが欲しいもの デフォルトです。 Fooクラスの新しいメンバーをFooの古いシリアル化されたインスタンスから初期化できないため、それらは互換性がありません。

さて、あなたは「私は気にしない、私のアプリケーションでは、これらのフィールドが非初期化されることは受け入れられる」と言うかもしれません。もしそうなら 本当 ケースです、あなたは 新着 fooクラスはと同じです Fooクラス。これにより、Javaはオブジェクトがシリアル化に関して互換性があることを伝え、Javaは古いFooインスタンスを新しいFooクラスに脱必要にしたときに文句を言いません(ただし、新しいフィールドはまだ初期化されていません)。

初めて新しいクラスを作成し、SerialVersionUidを設定する場合、 あなたは契約を結んでいます. 。その契約は、 「同じSerialVersionUidを使用したこのクラスのすべての将来のバージョンについて、私はそれらが状態とシリアル化に関して互換性があることを保証します」.

クラスを変更する場合、そしてあなた 明示的に をしたい 禁止 古いバージョンの脱isision化されている場合、SerialVersionUidを新しい値に変更できます。これにより、古いオブジェクトが新しいクラスインスタンスに脱色を試みた場合、例外がスローされます。

他のヒント

クラスの構造に基づいて、自動的に生成されます。構造が変更された場合、IDは再生されます( シリアル化仕様 それはクラスのハッシュです)。

したがって、明示的なものを定義する方がよいでしょう serialVersionUID.

EclipseをIDEとして使用している場合、欠落しているSerialVersionUidについての警告を右クリックすると、2つのオプションが表示されます。

1)値1Lを持つEclipseデフォルトを定義します。また
2)ランダムに生成された長い値を定義します

シリアル化されたオブジェクトのバージョン化を気にする場合は、クラスを変更するたびに新しい値を手動で再生する必要があります。 SerializableインターフェイスのJavadocには、SerialVersionUidをまったく宣言しない場合に何が起こるかについて述べています。

SerializableクラスがSerialVersionUidを明示的に宣言しない場合、シリアル化ランタイムは、Java(TM)オブジェクトシリアル化仕様に記載されているように、クラスのさまざまな側面に基づいてそのクラスのデフォルトのシリアルバージョン値を計算します。ただし、デフォルトのシリアルバージョンユーイド計算は、コンパイラの実装によって異なる場合があるため、デフォルトのシリアルバージョン使用の詳細に非常に敏感であるため、すべてのシリアル化可能なクラスがシリアルバージョンの値を明示的に宣言することを強くお勧めします。したがって、さまざまなJavaコンパイラの実装にわたって一貫したシリアルバージョンの値を保証するには、シリアル化可能なクラスは明示的なシリアルバージョンの値を宣言する必要があります。

実際には、2つ以上のマシン(たとえば、Subversionなどからチェックアウトされた)で同一のソースコードから始めても、SerialVersionuidがクラスで未定義になっている場合、クラスのコンパイラ生成値はそれぞれ異なることがわかりました。コードがコンパイルされたときのマシン。これにより、開発中に混乱するエラーが発生する可能性があります。

新しいバージョンのクラス(または2つのJVMが互いに、おそらく互いに並んでいないオブジェクトを送信する2つのJVMが並んでいる状況があると確信している場合は、おそらくネットワークまたはソケット接続)は、SerialVersionUidの値を1Lの値を設定し、そのようにして永久に残します。

http://download-llnw.oracle.com/javase/6/docs/api/java/io/serializable.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top