【问题标题】:serialVersionUID field warning in eclipseeclipse中的serialVersionUID字段警告
【发布时间】:2012-06-18 15:20:06
【问题描述】:

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

可序列化类TestGUI没有声明静态final 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);
    }

}

提前谢谢!

【问题讨论】:

标签: java serialization awt serialversionuid


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    TestGUI 扩展 Frame 进而实现 SerializableSerializable 接口的要求是有一个final long serialVersionUID 字段。请参阅Serializable javadoc 了解更多信息。

    引用该 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...
    

    【讨论】:

    • 但我过去一直从事序列化工作,从未声明过任何此类字段,也从未收到此警告。这次有什么不同?或者之前有什么不同?
    • javadoc 也说:If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification.
    • Eclipse 可能禁用了该警告。
    • Eclipse 在该警告上有一个“快速修复”选项,可以根据需要生成一个 serialVersionUID 字段。或者,如果您不打算实际序列化此对象,那么您可以在 Eclipse 首选项中禁用编译器警告。
    • @SurenderThakran 如果您过去从事过序列化工作,那么您应该知道为什么序列版本在 RMI/CORBA 中很重要。如果没有,请尝试阅读 Joshua Block 的 Effective Java。例如,如果您将异常更改为在内部存储不同的类型,那么与您的代码接口的客户端可能会随着串行版本的更改而突然崩溃。见stackoverflow.com/a/285809/200987
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 2018-09-15
    • 1970-01-01
    • 2014-03-18
    • 2013-03-31
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多