質問

時のクラスはSerializableを実装し、Eclipseがうまくいきませんのオプション:デフォルトの追加 serialVersionUID(1L) または発生する serialVersionUID(3567653491060394677L).私はクーラーが何度も目にした人々を第二のオプションです。あらかの理由を long serialVersionUID?

役に立ちましたか?

解決

調査を実施しているのは、同じ考えているとの互換性を維持するため、以前のリリースなどで行っています。このことはみなければならないときに便利です怠serialVersionUIDを使用の前に、その変更を知るべき 対応 が原因となる直列化が割れてしまったりします。

を参照 Java直列化仕様 できます。

他のヒント

シリアル化バージョン UID の目的は、オブジェクトの有効なシリアル化を実行するために、クラスのさまざまなバージョンを追跡することです。

このアイデアは、クラスの特定のバージョンに固有の ID を生成し、シリアル化されたオブジェクトの構造に影響を与える新しいフィールドなどの新しい詳細がクラスに追加されたときに ID を変更するというものです。

常に同じIDを使用する、など 1L これは、将来、クラス定義が変更され、シリアル化されたオブジェクトの構造が変更された場合、オブジェクトを逆シリアル化しようとすると問題が発生する可能性が高いことを意味します。

ID を省略した場合、実際には Java がオブジェクトのフィールドに基づいて ID を計算しますが、これは高価なプロセスであると考えられるため、手動で ID を指定するとパフォーマンスが向上します。

以下に、クラスのシリアル化とバージョン管理について説明した記事へのリンクをいくつか示します。

の主な理由が既にコピーを持続していたクラスの既存のバージョンと互換性を持たせることであろう生成されます。

の"長く"デフォルトの serialVersionUID デフォルト値はfalseで定義された Java直列化仕様, から計算された、デフォルトの直列化活動しています。

なので追加した場合、デフォルトのバージョン番号は、クラスデserializeより速くても構造的に変更できるよう配慮し変更した場合にクラスの追加と削除分野での更新、シリアル番号です。

していない場合の対応により、既存のビットの流したりすることも可能ですけ 1L が追加モードの場合は、ファイバージョンに対して必要な何かが変わります。この時のデフォルトのserialisationの変更をクラスとは異なるデフォルトのバージョンのクラスです。

あなたは、あなたが実装するクラスを定義するたびに、絶対にシリアルversionionuidを作成する必要があります java.io.Serializable. 。そうしないと、自動的に作成されますが、これは悪いことです。自動生成されたSerialVersionUidは、クラスのメソッド署名に基づいているため、クラスを変更してメソッド(たとえば)を追加すると(たとえば)、クラスの「古い」バージョンの脱却が失敗します。これが起こる可能性があります:

  1. SerialVersionUidを定義せずに、クラスの最初のバージョンを作成します。
  2. クラスのインスタンスを永続ストアにシリアル化します。SerialVersionUidが自動的に生成されます。
  3. クラスを変更して新しいメソッドを追加し、アプリケーションを再デプロイします。
  4. ステップ2でシリアル化されたインスタンスをゆるくしようとしますが、今では失敗します(成功するはずです)。

あなたはserialVersionUIDのを指定しない場合は、Javaはその場で1になります。生成されたserialVersionUIDのはその数です。あなたは本当に以前のシリアル化さverisonsであなたのクラスは、互換性のない作るが、ハッシュを変更していない、あなたのクラスで何かを変更した場合は、生成された超大多数のserialVersionUID(またはエラーメッセージから、「期待される」番号)を使用する必要があります。あなたはすべてのトラックを維持している場合はそうでない場合は、自分自身、0、1、2 ...良いです。

あなたはむしろあなたが何かを言っているのserialVersionUID(3567653491060394677L)を生成するよりも、serialVersionUIDの(1L)を使用するときます。

あなたは何のシステム今まで1のバージョン番号を使用して、このクラスの非互換シリアル化されたバージョンがあり、このクラスには触れていないだろうということを100%確信していると言っている。

あなたはそれが自信を持って言うのは難しいかもしれないと、不明であることをシリアル化されたバージョン履歴だためにどんな言い訳を考えることができます。ではその寿命だ、成功したクラスは、多くのプロジェクトに住んで、多くの人々によって維持され、多くのシステムに常駐されます。

あなたはその上でアゴナイズすることができます。それとも、失うことを望んで宝くじを再生することができます。あなたはバージョンを生成した場合、あなたは間違って物事の小さなチャンスがあります。あなたが想定した場合、あなたのオッズは小さなより大きい「ねえ、私は誰もまだ1を使用していない賭け」。我々はすべて0と1は、あなたがそれらを打つの高いオッズを持っていることをクールだと思うので、それは正確です。

-

あなたはなく、あなたが何かを言っているのserialVersionUID(1L)を使用します。serialVersionUIDの(3567653491060394677L)を生成すると、

あなたが言っている人々が持っているかもしれ手動で作成またはこのクラスの歴史上、他のバージョン番号を生成し、ロングスは大きな数字をおかしくしているので、あなたが気にしない。

あなたは完全にそれを持っているところの宇宙全体でクラスをシリアル化するときに使用されるバージョン番号の歴史を知っているか、これまでに、あなたはチャンスを取っている存在する場合を除きいずれかの方法。あなたは1がAOKで100%確実にする時間を持っている場合は、それのために行きます。それは多くの仕事になら、先に行くと盲目的に番号を生成します。あなたはそれが間違って行く持っているよりも、宝くじを獲得する可能性が高くなります。もしそうであれば、私に知らせて、私はあなたにビールを買うよ。

私はあなたのserialVersionUIDがランダムに生成された印象を与えている可能性が宝くじをプレイするすべてのこの講演では。実際に限り、番号の範囲は、均等に罰金だろうロングのすべての可能な値に分散されます。しかし、それは実際にこの方法を行うのます:

http://docs.oracle。 COM /のJava SE / 6 /ドキュメント/プラットフォーム/シリアライズ/スペック/ class.html#4100

あなたがそれを得る唯一の違いは、あなたがランダムのソースを必要としないです。あなたは結果を変更するには、クラス自体の変化を使用しています。しかし、鳩の巣原理に従って、それは間違って行くとの衝突を持っている可能性がチャンスはまだあります。それはちょうど信じられないそうです。だから、幸運が私の外にビールを取得します。

しかし、クラスがしか手で数をインクリメントすることはあなたの衝突のゼロチャンスを与えるだけでは、人間を理解していないことを意味することを考えて、一つのシステムと一つのコードベースに住むことになる場合でも。 :)

さて、serialVersionUIDのは、「静的フィールドは、シリアライズ取得しない」というルールの例外です。 ObjectOutputStreamのは毎回出力ストリームへのserialVersionUIDの値を書き込みます。 ObjectInputStreamのは戻ってそれを読み込み、ストリームから読み込まれた値は、クラスの現在のバージョンでserialVersionUIDの値と一致しない場合、それはによりInvalidClassExceptionがスローされます。公式にシリアライズされるクラスで宣言されたのserialVersionUIDがない場合また、コンパイラが自動的にクラスで宣言されたフィールドに基づいて生成された値でそれを追加します。

多くの場合、デフォルトのIDは一意ではありませんので。私たちは、ユニークなコンセプトを作るためのIDを作成します。

私はいつも大会のうち、デフォルト1Lを使用する経験則として、@デビッドSchmitts答えに追加します。私は戻って、そのうちのいくつかのいくつかの時間を変更しなければならなかったが、私は1ずつ変化と更新デフォルト数を作ったとき、私は知っていました。

私の現在の会社では、彼らが自動生成された番号が必要なので、私は大会のためにそれを使用しますが、私はデフォルトのを好みます。あなたは常に何らかの理由でシリアル化されたクラスの構造を変えることになると思うしない限り、私のテイクでは、それはあなたが仕事慣例ではない場合は、デフォルトを使用、である。

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