244

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

PS私はOOPが何であるかを知っています。オブジェクト、クラス、メソッド、フィールド、およびインスタンス化とは何かを知っています。

PPS誰かが私のコードを必要とするなら、それはここにあります:

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

}
4

5 に答える 5

168

javadocから:

シリアライゼーション ランタイムは、各シリアライズ可能なクラスに と呼ばれるバージョン番号を関連付けます。このバージョン番号は、serialVersionUIDデシリアライズ中に使用され、シリアライズされたオブジェクトの送信者と受信者が、シリアライゼーションに関して互換性のあるそのオブジェクトのクラスを読み込んでいるかどうかを確認します。serialVersionUIDレシーバーが、対応するセンダーのクラスとは異なるオブジェクトのクラスをロードした場合、逆シリアル化はInvalidClassException. シリアライズ可能なクラスは、名前付きのフィールドを static、final、および long 型でserialVersionUID宣言することにより、明示的に宣言できます。"serialVersionUID"

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

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

追加の質問によると、「議論された警告メッセージが、GUI アプリケーションがフリーズする理由である可能性がありますか?」:

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

于 2010-02-18T13:41:39.893 に答える
45

これまでの他の回答には、多くの技術情報があります。リクエストに応じて、簡単な言葉で答えようとします。

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

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

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

于 2013-04-26T16:36:27.633 に答える
37

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

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;
于 2010-02-18T14:19:22.313 に答える
27

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

それは正しくなく、その主張の信頼できる情報源を引用することはできません。オブジェクトシリアル化仕様の「シリアル化可能なオブジェクトのバージョン管理」セクションに記載されているルールに準拠しない変更を行う場合は常に変更する必要があります。これには、追加のフィールドやフィールドの順序の変更は含まれいません /またはorメソッドおよび/または変更に対処できる宣言。readObject(), writeObject(),readResolve()/writeReplace()serializableFields

于 2010-02-18T21:16:01.013 に答える
5

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

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

于 2010-02-18T13:42:40.713 に答える