4

Web アプリケーションの一般的なシナリオ:

  • アプリケーションには、Session に格納する必要があり、シリアライズ可能なクラスが多数あります
  • 開発者は、「Serializable クラスは serialVersionUID を実装していません」という警告を大量に受け取ります。
  • 開発者が肩をすくめて IDE の「serialversionUID を追加」をクリックすると、問題は解決しますか?

ソリューションは本質的にそれを意味するため、原則としてserialVersionUIDを自動的に追加するのは好きではありません

  • 最も重要なことは、開発者が「自分の変更がいつシリアル化を壊すのか、いつ壊さないのかを知っていて、JVM の代わりにそれを制御したい」と述べていることですが、実際には、彼はそれらのことを知ら、それらを制御したくないのです。
  • serialVersionUID = 6266256561409620894L を追加するのは紛らわしく醜いです (わかりました、1L を使用できます)。

クラスの互換性が問題となるアプリケーションに serialVersionUID を追加することを理解しており、開発者は積極的にそれを考慮し、関連する問題を理解しています。

典型的な Web アプリケーションでは、クラスのシリアル化がいつ壊れるかどうかはあまり重要ではありません。新しいバージョンがデプロイされると、関係のないシリアライズされたセッションが壊れることがありますが、通常は問題になりません (また、シリアライズされたセッションのバージョン互換性を実際に適切に処理するアプリケーションはほとんどありません)。

結論: 「ソース ファイルで serialVersionUID を常に明示的に定義する」というアドバイスは単純ではありませんか?

4

4 に答える 4

1

serialVersionUID を提供しないことが良い考えであることはめったにありません。

  • これを省略すると、クラスにわずかな変更を加えただけで、以前のシリアライゼーションとの互換性がなくなり、シリアライゼーションの例外が発生します。

  • それを提供し、後でオブジェクトのシリアライゼーション仕様、オブジェクトのバージョン管理セクションと互換性のある方法でクラスを変更すると、それは機能するので、すでに先を行っています。そして、これは多くのケースをカバーしています。具体的には、変更されたのがメソッドだけであるすべてのケースをカバーしています。

  • その仕様と互換性のない方法でクラスを変更すると、シリアライゼーション例外が発生するので、それに対処できます。

状況は少しも比較できません。オブジェクトの自動バージョニングは、シリアライズ可能なフィールドへの変更のごくわずかなケースや最も一般的なケースについて、メソッドを気にしません。デフォルトの serialVersionUID 計算に依存すると、オブジェクトのバージョニングがカバーする多くのケースが除外されます。

于 2011-08-27T02:31:09.140 に答える
1

私はあなたに同意し、現在のプロジェクトでも同じことを行います。この警告は、コンパイラ オプションで完全に無効になっています。

于 2011-08-26T13:52:55.330 に答える
1

ソース コードで serialVersionUID を定義するようにというアドバイスがどれだけの水を保持しているかを尋ねているのか、それとも単にクラスをシリアル化する必要がない場合に、警告を直接抑制するか不本意に定義することによって警告を回避した方がよいかを尋ねているのかどうかはわかりません。とにかくserialiVersionUID。

2 つのオプション ( serialVersionUID の追加と警告の抑制) は 2 つの異なるものです。1 つ目は、クラスのバージョンの変更に伴う適切なシリアライゼーションを容易にすることです。2 つ目は、クラスを変更するためのシリアライゼーションを行わないことです。それらは交換可能ではありません。そのため、プログラマーは 2 つの間で選択を行う場合、どちらが単純かではなく、設計要件に適した方を選択する必要があります。

于 2011-08-26T14:01:49.693 に答える
0

あなたは、絶対に正しい。serialVersionUID が実際に何をするかを理解し、それが正しいことであると確信している場合にのみ、serialVersionUID を追加してください。あなたは明らかにそれが実際に何をするかを理解しており、それが正しいことではないと確信しているので、追加しないでください.

コンパイラをシャットダウンし、@SuppressWarnings を追加する必要がないため、多くのプログラマが反射的に serialVersionUID を追加しているのを目にします。これは間違ったことであり、彼らは悪い人です。

結論: 「ソース ファイルで serialVersionUID を常に明示的に定義する」というアドバイスは単純ではなく、完全に間違っています。

于 2011-08-26T13:59:52.030 に答える