Serialization
そして
SerialVersionUID
多くの Java 開発者にとって常に謎のままです。とは何か、または -classで
SerialVersionUID
宣言しないとどうなるのかという質問をよく見かけます。 この質問のもう 1 つの理由は、混乱し、使用頻度が低いこととは別に、Eclipse IDE に警告がないことです。たとえば、「
Serializable クラス Customer は、 long型の静的な最終 SerialVersionUID フィールドを宣言していません。 」)。この記事では、Java の基本だけでなく、シリアル化と逆シリアル化のプロセスに対する Java の影響についても学びます。トークン インターフェイスを実装する場合などにクラスを宣言すると、プロセスが
Externalizable インターフェイスを使用するように構成されていない限り、Java ランタイムはデフォルトのシリアル化メカニズムを使用してそのクラスのインスタンスをディスクに保存します。シリアル化中に、Java ランタイムは、後でクラスを逆シリアル化できるように、クラスのバージョン番号を作成します。Java では、このバージョン番号は として知られています。逆シリアル化中に一致するものがない場合、プロセスは" "ストリームで例外を発生して終了し、クラス名と対応する も出力します。この問題を解決する簡単な解決策は、それをコピーしてクラスの型定数として定義することです。この記事では、 Java で を使用する理由と、serialver JDK ツールを使用してこの ID を生成する方法について学びます。シリアル化を初めて使用する場合は、
Java シリアル化インタビューの質問トップ 10 を視聴して自分の知識を評価し、理解のギャップを見つけてさらに読むこともできます。(同時実行性) や(マルチスレッド) と同様、(シリアル化) も何度か読む価値のあるトピックです。
SerialVersionUID
Serializable
SerialVersionUID
Serializable
Customer
SerialVersionUID
SerialVersionUID
Serializable
java.io.Serializable
SerialVersionUID
SerialVersionUID
InvalidClassException
main
java.io.InvalidClassException
SerialVersionUID
SerialVersionUID
private
static
final
long
SerialVersionUID
Concurrency
Multi-threading
Serialization
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」には、通常形式の利点を詳細に説明するいくつかの段落があります。
serialver
SerialVersionUID
SerialVersionUID
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 –show
serial version
Serial version
まとめ
これで、それが何であるか
SerialVersionUID
、そしてそれを -class で宣言することがなぜ重要なのかがわかり
Serializable
ました。次に、Java SerialVersionUID に関連するいくつかの重要な事実を確認します。
SerialVersionUID
シリアル化されたデータのバージョンを示すために使用されます。
- クラス内で宣言しない場合は
SerialVersionUID
、Java ランタイムが代わりにそれを行いますが、このプロセスは、フィールドの数、フィールドのタイプ、フィールド アクセス修飾子、クラスに実装されているインターフェイスなど、クラスの多くのメタデータの影響を受けます。など。正確な情報は、Oracle のシリアル化ドキュメントで見つけることができます。
- デフォルトのメカニズムを回避するには、SerialVersionUID をプライベートの静的な Final Long 変数として宣言することをお勧めします。Eclipseなどの一部の IDE では、これを忘れた場合に、「Serializable クラス Customer は、long 型の静的な最終 SerialVersionUID フィールドを宣言していません。」などの警告を発行します。[ウィンドウ] > [設定] > [Java] > [コンパイラ] > [エラー/警告] > [潜在的なプログラミングの問題] に移動すると、この警告を無効にすることができますが、そうしないことをお勧めします。データ復旧が必要でない場合に限り、油断できるのです。このエラーは Eclipse IDE でどのように表示されるかを次に示します。必要なのは、最初の迅速な決定だけです。
- JDK の Serialver ユーティリティを使用して、Java のクラスのシリアル バージョンを生成することもできます。このユーティリティには GUI もあり、 - パラメータを渡すと有効になります
show
。
- シリアル化のベスト プラクティスは、
SerialVersionUID
特に RMI などのシリアル化されたデータに依存するクライアント/サーバー アプリケーションを使用している場合、逆シリアル化の問題を回避するために、 を明示的に宣言することです。
それはすべて
SerialVersionUID
Java に関するものです。
SerialVersionUID
これで、クラス内で正しく宣言することがなぜ重要なのかが分かりました。クラスの逆シリアル化が中断される可能性があるこのリマインダーについては、IDE に感謝することができます。シリアル化と関連する概念について詳しく知りたい場合は、これらの素晴らしい記事もご覧ください。
オリジナル
はこちら
GO TO FULL VERSION