JavaRush /Java Blog /Random-JA /Java の Serializable クラス内で SerialVersionUID を使用する理由
0xFF
レベル 9
Донецк

Java の Serializable クラス内で SerialVersionUID を使用する理由

Random-JA グループに公開済み
SerializationそしてSerialVersionUID多くの Java 開発者にとって常に謎のままです。とは何か、または -classでSerialVersionUID宣言しないとどうなるのかという質問をよく見かけます。 この質問のもう 1 つの理由は、混乱し、使用頻度が低いこととは別に、Eclipse IDE に警告がないことです。たとえば、「Serializable クラス Customer は、 long型の静的な最終 SerialVersionUID フィールドを宣言していません。 」)。この記事では、Java の基本だけでなく、シリアル化と逆シリアル化のプロセスに対する Java の影響についても学びます。トークン インターフェイスを実装する場合などにクラスを宣言すると、プロセスがExternalizable インターフェイスを使用するように構成されていない限り、Java ランタイムはデフォルトのシリアル化メカニズムを使用してそのクラスのインスタンスをディスクに保存します。シリアル化中に、Java ランタイムは、後でクラスを逆シリアル化できるように、クラスのバージョン番号を作成します。Java では、このバージョン番号は として知られています。逆シリアル化中に一致するものがない場合、プロセスは" "ストリームで例外を発生して終了し、クラス名と対応する も出力します。この問題を解決する簡単な解決策は、それをコピーしてクラスの型定数として定義することです。この記事では、 Java で を使用する理由と、serialver JDK ツールを使用してこの ID を生成する方法について学びます。シリアル化を初めて使用する場合は、Java シリアル化インタビューの質問トップ 10 を視聴して自分の知識を評価し、理解のギャップを見つけてさらに読むこともできます。(同時実行性) や(マルチスレッド) と同様、(シリアル化) も何度か読む価値のあるトピックです。 SerialVersionUIDSerializableJava の Serializable クラス内で SerialVersionUID を使用する理由 - 1SerialVersionUIDSerializableCustomerSerialVersionUIDSerialVersionUIDSerializablejava.io.SerializableSerialVersionUIDSerialVersionUIDInvalidClassExceptionmainjava.io.InvalidClassExceptionSerialVersionUIDSerialVersionUIDprivate static final longSerialVersionUIDConcurrencyMulti-threadingSerialization

Java で SerialVersionUID を使用する理由

SerialVersionUID先ほども述べたように、クラス内で値を定義していない場合はstatic final long、シリアル化メカニズムが代わりに値を定義します。このメカニズムは、クラスのフィールド、そのアクセス修飾子、実装するインターフェイス、さらには異なるコンパイラの実装など、多くの詳細に影響を受けます。クラスに変更を加えたり、異なるコンパイラを使用すると、異なる結果が生成される可能性があり、SerialVersionUID最終的にはこの ID を生成するために Java のシリアル化メカニズムに依存するのは危険であるため、Serializable クラスSerialVersionUIDで明示的に定義することをお勧めします。Java のシリアル化とその誤った処理の問題を理解するには、Java の古典であるJoshua Bloch 『Effective Java』を読むことを強くお勧めします。ちなみに、JDK は、私のコンピュータのJAVA_HOMEディレクトリのbinディレクトリC:\Program Files\Java\jdk1.6.0_26\bin\serialver.exeにあるツールも提供しています。古いクラス用。これは、シリアル化を中断するような変更をクラスに加え、アプリケーションがシリアル化されたインスタンスをリロードできない場合に非常に役立ちます。このユーティリティを使用して古いインスタンスを簡単に作成し、フィールドをprivate static Final longとして宣言することで明示的に使用できます。ちなみに、パフォーマンスとセキュリティ上の理由から、シリアル化には通常のバイナリ形式を使用することを強くお勧めします。繰り返しますが、「Effective Java」には、通常形式の利点を詳細に説明するいくつかの段落があります。 serialverSerialVersionUIDSerialVersionUID SerialVersionUID

Serialver JDK ユーティリティを使用して SerialVersionUID を生成する方法

serialverクラスの生成に使用できますSerialVersionUID。これはクラスを開発する場合に特に便利で、ユーティリティはSerialVersionUIDコピーしやすい形式で返されます。serialver次の例に示すように、JDK ユーティリティ を使用できます。
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
このユーティリティをコマンドserialverとして使用することもできます。これにより、完全なクラス名を取得して表示するインスペクタが開きます。 GUI$ serialver –showserial versionSerial version

まとめ

これで、それが何であるかSerialVersionUID、そしてそれを -class で宣言することがなぜ重要なのかがわかりSerializableました。次に、Java SerialVersionUID に関連するいくつかの重要な事実を確認します。
  1. SerialVersionUIDシリアル化されたデータのバージョンを示すために使用されます。

  2. クラス内で宣言しない場合はSerialVersionUID、Java ランタイムが代わりにそれを行いますが、このプロセスは、フィールドの数、フィールドのタイプ、フィールド アクセス修飾子、クラスに実装されているインターフェイスなど、クラスの多くのメタデータの影響を受けます。など。正確な情報は、Oracle のシリアル化ドキュメントで見つけることができます。

  3. デフォルトのメカニズムを回避するには、SerialVersionUID をプライベートの静的な Final Long 変数として宣言することをお勧めします。Eclipseなどの一部の IDE では、これを忘れた場合に、「Serializable クラス Customer は、long 型の静的な最終 SerialVersionUID フィールドを宣言していません。」などの警告を発行します。[ウィンドウ] > [設定] > [Java] > [コンパイラ] > [エラー/警告] > [潜在的なプログラミングの問題] に移動すると、この警告を無効にすることができますが、そうしないことをお勧めします。データ復旧が必要でない場合に限り、油断できるのです。このエラーは Eclipse IDE でどのように表示されるかを次に示します。必要なのは、最初の迅速な決定だけです。 Java の Serializable クラス内で SerialVersionUID を使用する理由 - 2

  4. JDK の Serialver ユーティリティを使用して、Java のクラスのシリアル バージョンを生成することもできます。このユーティリティには GUI もあり、 - パラメータを渡すと有効になりますshow

  5. シリアル化のベスト プラクティスは、SerialVersionUID特に RMI などのシリアル化されたデータに依存するクライアント/サーバー アプリケーションを使用している場合、逆シリアル化の問題を回避するために、 を明示的に宣言することです。
それはすべてSerialVersionUIDJava に関するものです。SerialVersionUIDこれで、クラス内で正しく宣言することがなぜ重要なのかが分かりました。クラスの逆シリアル化が中断される可能性があるこのリマインダーについては、IDE に感謝することができます。シリアル化と関連する概念について詳しく知りたい場合は、これらの素晴らしい記事もご覧ください。 オリジナルはこちら
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION