它意味着什么:的序列化类不宣布一个静态的最终serialVersionUID领域?[重复]

StackOverflow https://stackoverflow.com/questions/2288937

这个问题已经有一个答案在这里:

我已经警告信息给定的标题。我想了解和将其删除。我已经找到一些答案在这个问题,但我不明白这些问题的答案,因为载有技术术语。是否可以解释这个问题,简单的词?

P.S.我知道什么是面向对象。我知道什么是对象,类、方法领域和实例。

P.P.S.如果有人需要我的代码它是在这里:

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

}
有帮助吗?

解决方案

如果是的话,为什么不试:

化运行时将与每个序列化类的一个版本的数量,称为 serialVersionUID, ,这是使用过反验证的发送和接收的化对象已载入课程,对象是兼容的,相对于serialization.如果接收器已经装载一类为对象具有不同的 serialVersionUID 比相应的发送者的类,然后反将导致一个 InvalidClassException.一个序列化类可以宣布自己 serialVersionUID 明确地宣布,一场名为 "serialVersionUID" 这必须是静态的,最终和类型的长:

你可以配置IDE:

  • 忽略这一点,而不是给一个警告。
  • 自动生成一个id

按您的附加问题",可以说讨论了警告信息是一个原因为什么我GUI应用程序冻结?":

不,这不可能的。它可以引起一个问题,只有如果你顺序的对象和反序列化它们在不同的地方(或时间)在(当时)的类已经改变,并且这将不会导致冻结,但在 InvalidClassException.

其他提示

原因,警告记录了 在这里,, ,以及简单修正关闭警告,或者将以下的宣言,在你的代码来源的版本UID。实际价值是不相关的,开始与999如果你喜欢,但是改变它的时候你使不相容的更改类。

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;

其他的答案,迄今有很多的技术信息。我会尽量回答的请求,在简单的条款。

化是你做的对象的实例如果你想要转储到一个原始缓冲区,保存到磁盘、运输在一个二流(例如,发送对象,通过网络socket),或者创建一个二进制序列化表示的对象。(欲了解更多信息序列化看看 Java化上的维基百科).

如果你有没有打算将你的课,你可以添加的注释上你的课 @SuppressWarnings("serial").

如果你要serialize,那么你有许多事情要担心的都围绕着适当的积.基本上,东的一种方式"版本"的对象,你会serialize因此,不管过程是将知道它的de-顺序正确。我想看看 确保适当的版本控制化的对象 更多的信息。

它必须改变,只要任何东西 变化影响的序列 (其他字段,删除段, 改变的领域以,...)

这是不正确的,并且你将不能举出一个authoriitative源的要求。它应该被更改,只要你做变动,是不符合根据《规则》中给出的 版本的序列化的对象 部分的 目列化规范, ,其具体做 包括额外的领域或改变的领域秩序, 当你还没有提供 readObject(), writeObject(), 和/或 readResolve()/writeReplace() 方法和/或 serializableFields 《宣言》,可以应付的变化。

任何类别的可行化(即实现了 Serializable)应宣布UID,它必须改变,每当有什么变化影响的序列(其他字段,删除段,改变的领域以,...).该领域的价值,为检查期间反,如果价值的化对象并不等于值班级在当前的虚拟机,一个例外被抛出。

注意,这值是特殊的,这是化与对象虽然是静态的原因,以上所述。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top