web-dev-qa-db-ja.com

どういう意味ですか:シリアル化可能なクラスは、静的な最終serialVersionUIDフィールドを宣言しませんか?

タイトルに警告メッセージがあります。理解して削除したいと思います。この質問に対する回答はすでにいくつか見つかりましたが、専門用語が多すぎるため、これらの回答は理解できません。この問題を簡単な言葉で説明することは可能ですか?

追伸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();
                }
            });
        }

}
198
Roman

javadoc から:

シリアル化ランタイムは、各シリアル化可能クラスにserialVersionUIDと呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信者と受信者がシリアル化に関して互換性のあるオブジェクトのクラスをロードしたことを確認するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なるserialVersionUIDを持つオブジェクトのクラスをロードした場合、逆シリアル化はInvalidClassExceptionになります。直列化可能なクラスは、静的で、finalで、long型でなければならない"serialVersionUID"という名前のフィールドを宣言することにより、独自のserialVersionUIDを明示的に宣言できます。

IDEを次のように構成できます。

  • 警告を出す代わりに、これを無視してください。
  • iDを自動生成します

「質問された警告メッセージが、GUIアプリケーションがフリーズする理由である可能性はありますか?」

いいえ、できません。オブジェクトをシリアライズし、クラスが変更された(いつ)別の場所(または時間)でオブジェクトをデシリアライズする場合にのみ問題が発生する可能性があり、InvalidClassExceptionでフリーズは発生しません。

147
Bozho

警告の理由は here で文書化されており、簡単な修正は警告をオフにするか、コードに次の宣言を追加してバージョンUIDを提供することです。実際の値は関係ありません。必要に応じて999から始めますが、クラスに互換性のない変更を加えたときに変更することは重要です。

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;
32
Robin

他の答えには、これまでのところ多くの技術情報があります。要求に応じて、簡単な言葉で答えようとします。

シリアル化は、生のバッファにダンプしたり、ディスクに保存したり、バイナリストリームで転送したり(ネットワークソケットを介してオブジェクトを送信したり)する場合に、オブジェクトのインスタンスに対して行うことです。オブジェクトのバイナリ表現。 (シリアル化の詳細については、 WikipediaでのJavaシリアル化 を参照してください)。

クラスをシリアル化するつもりがない場合は、クラス@SuppressWarnings("serial")のすぐ上に注釈を追加できます。

シリアル化する場合は、UUIDの適切な使用を中心としたすべてのことを心配する必要があります。基本的に、UUIDは、シリアル化するオブジェクトを「バージョン管理」する方法であるため、逆シリアル化するプロセスが適切に逆シリアル化されていることがわかります。詳細については、 シリアル化されたオブジェクトの適切なバージョン管理を確認する を参照してください。

31
MrMas

シリアル化に影響する変更(追加のフィールド、削除されたフィールド、フィールドの順序の変更など)があるたびに変更する必要があります。

それは正しくなく、その主張の信頼できる情報源を引用することはできません。 Object Serialization SpecificationSerializable Objectsのバージョン管理 セクションで指定されているルールの下で互換性のない変更を行う場合は必ず変更する必要があります。具体的にはnot追加フィールドまたはフィールド順序の変更を含める、andreadObject(), writeObject(),を指定していない場合および/またはreadResolve()または/writeReplace()メソッドおよび/または変更に対処できるserializableFields宣言。

27
user207421

シリアル化できる(つまり、Serializableを実装する)クラスは、そのUIDを宣言する必要があり、シリアル化に影響する変更(追加のフィールド、削除されたフィールド、フィールドの順序の変更など)があるたびに変更する必要があります。フィールドの値は逆シリアル化中にチェックされ、シリアル化されたオブジェクトの値が現在のVMのクラスの値と等しくない場合、例外がスローされます。

この値は、上記の理由により、静的であってもオブジェクトと共にシリアル化されるという点で特別であることに注意してください。

5
Thomas Lötzer