それはどういう意味ですか:シリアル化可能なクラスは静的な最終のserialVersionUIDフィールドを宣言していませんか?[重複]
-
21-09-2019 - |
質問
この質問にはすでに答えがあります:
タイトルに警告メッセージが表示されています。ご理解いただいた上で削除させていただきたいと思います。この質問についてはすでにいくつかの回答を見つけましたが、専門用語が多すぎるため、これらの回答は理解できません。この問題を簡単な言葉で説明できますか?
追伸OOP が何であるかを知っています。オブジェクト、クラス、メソッド、フィールド、インスタンス化とは何かを知っています。
追伸誰かが私のコードを必要とする場合は、ここにあります:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing extends JFrame {
JTextArea m_resultArea = new JTextArea(6, 30);
//====================================================== constructor
public HelloWorldSwing() {
//... Set initial text, scrolling, and border.
m_resultArea.setText("Enter more text to see scrollbars");
JScrollPane scrollingArea = new JScrollPane(m_resultArea);
scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));
// Get the content pane, set layout, add to center
Container content = this.getContentPane();
content.setLayout(new BorderLayout());
content.add(scrollingArea, BorderLayout.CENTER);
this.pack();
}
public static void createAndViewJFrame() {
JFrame win = new HelloWorldSwing();
win.setTitle("TextAreaDemo");
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setVisible(true);
}
//============================================================= main
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndViewJFrame();
}
});
}
}
解決
から Javadoc:
シリアル化ランタイムは、各シリアル化可能クラスにバージョン番号と呼ばれる番号を関連付けます。
serialVersionUID
, これは、シリアル化解除中に、シリアル化されたオブジェクトの送信者と受信者が、シリアル化に関して互換性のあるそのオブジェクトのクラスをロードしていることを確認するために使用されます。受信側が異なるクラスを持つオブジェクトのクラスをロードした場合serialVersionUID
対応する送信者のクラスのクラスよりも大きい場合、逆シリアル化の結果、InvalidClassException
. 。直列化可能なクラスは独自のクラスを宣言できますserialVersionUID
という名前のフィールドを宣言することで明示的に"serialVersionUID"
これは static、final、long 型である必要があります。
IDE を次のように構成できます。
- 警告を発するのではなく、これを無視してください。
- IDを自動生成する
追加の質問「GUI アプリケーションがフリーズする理由は、説明されている警告メッセージにある可能性がありますか?」によると、
いいえ、そんなことはありえません。問題が発生するのは、クラスが変更された別の場所 (または時間) でオブジェクトをシリアル化および逆シリアル化する場合のみであり、フリーズは発生しませんが、 InvalidClassException
.
他のヒント
は警告の理由はにここhref="https://stackoverflow.com/questions/285793/why-should-i-bother-about-serialversionuid">
public class HelloWorldSwing extends JFrame {
JTextArea m_resultArea = new JTextArea(6, 30);
private static final long serialVersionUID = 1L;
他の回答は、これまでの技術的な多くの情報を持っています。要求されたように私は簡単な言葉で、答えにしようとします。
はシリアル化はあなたが生のバッファにそれをダンプしたい場合は、それをディスクに保存し、オブジェクトのインスタンスに行う(例えば、ネットワークソケットの上にオブジェクトを送信する)、またはその他のバイナリストリームにそれを輸送するものですオブジェクトの直列化されたバイナリ表現を作成します。 (シリアライズの詳細情報については、Wikipediaのの上 Javaのシリアライズを参照してください)。
あなたのクラスをシリアル化するつもりはない場合、あなたは自分のクラス@SuppressWarnings("serial")
の上に注釈を追加することができます。
、あなたはUUIDの適切な使用を中心に、すべての心配する事のホストを持っています。基本的には、UUIDは、あなたがどんなプロセスがデシリアライズは、それが適切にデシリアライズだということを知っているようにシリアライズう「バージョン」オブジェクトへの道です。私はのための適切なバージョン管理を確認してくださいになりますシリアライズされたオブジェクトは、より多くの情報のためを。
シリアル化に影響する変更が変更されるたびに変更する必要があります(追加のフィールド、フィールドの削除、フィールドオーダーの変更など)
それは正しくありません。その主張の信頼できる情報源を引用することはできません。「 シリアル化可能なオブジェクトのバージョン管理 のセクション オブジェクトのシリアル化仕様, 、具体的には ない 追加のフィールドを含めたり、フィールドの順序を変更したり、 そして 提供していないとき readObject(), writeObject(),
および/または readResolve()
または /writeReplace()
メソッドおよび/または serializableFields
変化に対応できる宣言。
シリアライズすることができ、任意のクラス(すなわち、実装Serializable
)は、UIDと、それは直列化(追加フィールド、削除フィールド、フィールドの順序の変更を、...)に影響を与える時はいつでも何も変更を変更しなければならないことを宣言しなければなりません。フィールドの値が直列化復元時にチェックされ、シリアライズされたオブジェクトの値が現在のVM内のクラスの値と等しくない場合、例外がスローされます。
注