タイトルに警告メッセージがあります。理解して削除したいと思います。この質問に対する回答はすでにいくつか見つかりましたが、専門用語が多すぎるため、これらの回答は理解できません。この問題を簡単な言葉で説明することは可能ですか?
追伸OOPとは何かを知っています。オブジェクト、クラス、メソッド、フィールド、インスタンス化とは何かを知っています。
P.P.S.誰かが私のコードを必要とする場合、それはここにあります:
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
になります。直列化可能なクラスは、静的で、finalで、long型でなければならない"serialVersionUID"
という名前のフィールドを宣言することにより、独自のserialVersionUID
を明示的に宣言できます。
IDEを次のように構成できます。
「質問された警告メッセージが、GUIアプリケーションがフリーズする理由である可能性はありますか?」
いいえ、できません。オブジェクトをシリアライズし、クラスが変更された(いつ)別の場所(または時間)でオブジェクトをデシリアライズする場合にのみ問題が発生する可能性があり、InvalidClassException
でフリーズは発生しません。
警告の理由は here で文書化されており、簡単な修正は警告をオフにするか、コードに次の宣言を追加してバージョンUIDを提供することです。実際の値は関係ありません。必要に応じて999から始めますが、クラスに互換性のない変更を加えたときに変更することは重要です。
public class HelloWorldSwing extends JFrame {
JTextArea m_resultArea = new JTextArea(6, 30);
private static final long serialVersionUID = 1L;
他の答えには、これまでのところ多くの技術情報があります。要求に応じて、簡単な言葉で答えようとします。
シリアル化は、生のバッファにダンプしたり、ディスクに保存したり、バイナリストリームで転送したり(ネットワークソケットを介してオブジェクトを送信したり)する場合に、オブジェクトのインスタンスに対して行うことです。オブジェクトのバイナリ表現。 (シリアル化の詳細については、 WikipediaでのJavaシリアル化 を参照してください)。
クラスをシリアル化するつもりがない場合は、クラス@SuppressWarnings("serial")
のすぐ上に注釈を追加できます。
シリアル化する場合は、UUIDの適切な使用を中心としたすべてのことを心配する必要があります。基本的に、UUIDは、シリアル化するオブジェクトを「バージョン管理」する方法であるため、逆シリアル化するプロセスが適切に逆シリアル化されていることがわかります。詳細については、 シリアル化されたオブジェクトの適切なバージョン管理を確認する を参照してください。
シリアル化に影響する変更(追加のフィールド、削除されたフィールド、フィールドの順序の変更など)があるたびに変更する必要があります。
それは正しくなく、その主張の信頼できる情報源を引用することはできません。 Object Serialization Specification の Serializable Objectsのバージョン管理 セクションで指定されているルールの下で互換性のない変更を行う場合は必ず変更する必要があります。具体的にはnot追加フィールドまたはフィールド順序の変更を含める、andreadObject(), writeObject(),
を指定していない場合および/またはreadResolve()
または/writeReplace()
メソッドおよび/または変更に対処できるserializableFields
宣言。
シリアル化できる(つまり、Serializable
を実装する)クラスは、そのUIDを宣言する必要があり、シリアル化に影響する変更(追加のフィールド、削除されたフィールド、フィールドの順序の変更など)があるたびに変更する必要があります。フィールドの値は逆シリアル化中にチェックされ、シリアル化されたオブジェクトの値が現在のVMのクラスの値と等しくない場合、例外がスローされます。
この値は、上記の理由により、静的であってもオブジェクトと共にシリアル化されるという点で特別であることに注意してください。