日食中的串行版本UID 字段警告

2022-09-03 09:43:48

我刚刚开始在AWT上并制作了一个简单的程序,它工作正常,但它在eclipse中显示了一条警告消息,我不明白:

可序列化类 TestGUI 不声明 long 类型的静态最终 serialVersionUID 字段

我知道警告消息与AWT无关,没有必要发布我的整个代码,但是当我试图制作代码的SSCCE时,警告也消失了。由于我不知道为什么生成此警告,我不知道在我的SSCCE中保留哪个部分。因此,整个代码!

我的代码是:

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestGUI extends Frame {
    /**
     * @param args
     */
    private int x = 50;
    private int y = 50;

    TestGUI(String s) {
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                setVisible(false);
                System.exit(0);
            }
        });
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent me) {
                x = me.getX();
                y = me.getY();
                repaint();
            }
        });
    }

    public void paint(Graphics g) {
        g.drawString("Hello Princess", 100, 100);
        g.drawString("Mouse clicked here", x, y);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestGUI tg = new TestGUI("first");
        tg.setSize(500, 500);
        tg.setVisible(true);
    }

}

提前感恩节!


答案 1

Eclipse 过去曾默认禁用该警告。在 Eclipse Indigo (3.7) 中,默认设置是启用警告。您可以在 2 个位置更改设置,一个用于工作区中的所有内容,另一个用于单个项目。

要禁用工作区中所有项目的警告,请转到“窗口/首选项”并打开Java /编译器/“错误/警告”选项卡,然后打开“潜在的编程问题”,然后将“没有serialVersionUID的可序列化类”的值更改为“忽略”(或您认为合适的任何内容)。

要禁用单个项目的警告,可以右键单击该项目,选择“属性”,然后转到“Java 编译器”/“错误/警告”,单击“启用项目特定设置”(如有必要),然后选择“潜在的编程问题”并将“不带 serialVersionUID 的可序列化类”的值更改为“忽略”(或您认为合适的任何内容)。


答案 2

TestGUI扩展,这反过来又实现了 .接口的要求是有一个字段。有关详细信息,请参阅可序列化的 javadocFrameSerializableSerializablefinal long serialVersionUID

引用该Javadoc的重要部分:

...it is strongly recommended that all serializable classes explicitly declare
serialVersionUID values, since the default serialVersionUID computation is highly
sensitive to class details that may vary depending on compiler implementations...