猿问

这是什么意思:可序列化类未声明静态最终的serialVersionUID字段?

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


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

                }

            });

        }


}


一只萌萌小番薯
浏览 1036回答 3
3回答

扬帆大鱼

从javadoc:序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,在反序列化过程中使用该版本号来验证序列化对象的发送者和接收者是否已加载了该对象的与序列化兼容的类。如果接收者为对象加载的类serialVersionUID与相应的发送者的类不同,则反序列化将导致InvalidClassException。可序列化的类可以serialVersionUID通过声明一个"serialVersionUID"必须为静态,最终且类型为long 的字段来显式声明其自身:您可以将IDE配置为:忽略它,而不是发出警告。自动生成一个id根据您的其他问题“可能是所讨论的警告消息是我的GUI应用程序冻结的原因吗?”:不,不可能。仅当序列化对象并在类已更改的其他位置(或时间)对对象进行反序列化时,它才可能导致问题,并且不会导致冻结,而会导致冻结InvalidClassException。

SMILET

警告的原因已在此处记录,简单的修复方法是关闭警告或在代码中添加以下声明以提供版本UID。实际值无关紧要,如果愿意,可以从999开始,但是在对类进行不兼容的更改时,请更改为实际值。public class HelloWorldSwing extends JFrame {        JTextArea m_resultArea = new JTextArea(6, 30);        private static final long serialVersionUID = 1L;

富国沪深

到目前为止,其他答案都有很多技术信息。我将尝试按要求用简单的方式回答。如果要将对象转储到原始缓冲区,将其保存到磁盘,以二进制流传输(例如,通过网络套接字发送对象)或以其他方式创建序列化对象,则对对象实例进行序列化对象的二进制表示形式。(有关序列化的更多信息,请参见Wikipedia上的Java序列化)。如果您不想序列化您的类,则可以在类上方添加注释@SuppressWarnings("serial")。如果要序列化,那么您将有很多事情要担心,所有问题都围绕UUID的正确使用。基本上,UUID是一种“版本化”您要序列化的对象的方法,这样,无论是反序列化的进程都知道它已正确地反序列化。我将查看确保序列化对象的正确版本控制以获取更多信息。
随时随地看视频慕课网APP

相关分类

Java
我要回答