这是什么意思:可序列化类不声明静态的最终串行VersionUID字段?

2022-08-31 05:40:10

我在标题中给出了警告消息。我想了解并删除它。我已经找到了关于这个问题的一些答案,但由于技术术语过载,我不明白这些答案。有没有可能用简单的词来解释这个问题?

附言:我知道OOP是什么。我知道什么是对象,类,方法,字段和实例化。

附言如果有人需要我的代码,它在这里:

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

}

答案 1

来自 javadoc

序列化运行时与每个可序列化类关联一个版本号,称为 a,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类。如果接收方为对象加载的类与相应发送方类的类不同,则反序列化将导致 .可序列化类可以通过声明名为的字段来显式声明自己的字段,该字段必须是静态的、final 的和 long 类型:serialVersionUIDserialVersionUIDInvalidClassExceptionserialVersionUID"serialVersionUID"

您可以将 IDE 配置为:

  • 忽略这一点,而不是发出警告。
  • 自动生成 ID

根据您的附加问题“讨论的警告消息是否是我的GUI应用程序冻结的原因吗?

不,不可能。仅当序列化对象并在类已更改的其他位置(或时间)反序列化对象时,它才会导致问题,并且不会导致冻结,而是在 .InvalidClassException


答案 2

到目前为止,其他答案有很多技术信息。我将按照要求,尽量用简单的术语来回答。

如果要将对象转储到原始缓冲区、将其保存到磁盘、在二进制流中传输对象(例如,通过网络套接字发送对象),或者以其他方式创建对象的序列化二进制表示形式,则可以对对象实例执行序列化操作。(有关序列化的更多信息,请参阅维基百科上的Java序列化)。

如果您无意序列化类,则可以在类的正上方添加注释。@SuppressWarnings("serial")

如果您要进行序列化,那么您有很多事情要担心,所有这些都围绕着UUID的正确使用。基本上,UUID 是一种对要序列化的对象进行“版本控制”的方法,以便任何正在反序列化的进程都知道它是否正确反序列化。我会查看确保序列化对象的正确版本控制以获取更多信息。


推荐