serialVersionUID缺少时,Eclipse会发出警告.
可序列化类Foo不声明long类型的静态最终serialVersionUID字段
serialVersionUID它是什么以及为什么重要?请显示缺失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 …Run Code Online (Sandbox Code Playgroud) 当类在Eclipse中实现Serializable时,我有两个选项:添加默认值serialVersionUID(1L)或生成serialVersionUID(3567653491060394677L).我认为第一个更酷,但很多时候我看到人们使用第二个选项.有没有理由生成long serialVersionUID?
我想创建一个类,例如,扩展HttpServlet?我的编译器警告我,我的类应该有一个serialVersionUID.如果我知道这个对象永远不会被序列化,我应该定义它还是添加注释来抑制这些警告?
你会做什么以及为什么?
在java中,如果一个类实现Serializable但是是抽象的,它是否应该声明一个longVersionUID,或者子类只需要它?
在这种情况下,确实意图是所有子类都处理序列化,因为该类型的目的是在RMI调用中使用.
当你使用类Exception扩展一个类(用于创建新的异常)时,你会得到一个警告serialVersionUID.我知道serialVersionUID在序列化和反序列化时它起着重要作用,但是当我的异常需要被序列化时?任何人都可以给我一个实际案例,我希望我的自定义异常类具有序列化和反序列化?
java serialization exception serialversionuid deserialization
这已成为我的一个宠儿.我写了一个课,并实施Serializible.然后eclipse警告我,我没有serialVersionUID,所以我选择" 添加生成的serialVersionUID "或" 添加默认的serialVersionUID ",我最终得到这样的东西:
/**
*
*/
private static final long serialVersionUID = 4049849541314027178L;
Run Code Online (Sandbox Code Playgroud)
大多数时候我不想添加评论,所以我必须去删除评论.我宁愿默认是没有评论,但我已经查看了偏好中的代码模板,并没有想出如何更改它.我只是希望它看起来像这样:
private static final long serialVersionUID = 4049849541314027178L;
Run Code Online (Sandbox Code Playgroud) 我可能会冒这个问题冒险.
在我看来,为新类显式指定serialVersionUID是不好的.考虑两种情况,即在布局应该更改时不更改它,并在不应该更改时更改它.
不应该改变它何时应该被改变发生几乎只有在它是明确的时候.在这种情况下,它会导致一些非常微妙,难以发现的错误.特别是在开发过程中,当类布局经常变化时.但是如果它没有明确指定,它将会改变并且反序列化将大声破坏,最有可能通过清除存储库来解决.
不应该发生的情况几乎只有在隐含时才会发生.这是一种罕见的情况,其中类布局已更改但我们仍希望从旧的序列化blob反序列化.这可能会在QA期间被捕获(从5.2升级到5.2.1之后的奇怪错误,请参阅附加的堆栈跟踪),并且可以通过设置显式值来轻松修复.
评论?
可能重复:
我为什么要打扰serialVersionUID?
我正在经历一些异常处理代码,我看到了一些名为serialVersionUID的东西.这个uid用于什么?是否仅限于例外或可以在所有类中使用??? 这个id有什么好处???
有没有办法确定serialVersionUID序列化Java对象的生成?
问题是我序列化了一个对象而没有明确指定serialVersionUID.现在反序列化过程抱怨类不兼容.但是我并没有以一种使它不兼容的方式改变这个类.所以我假设serialVersionUID在类中指定它就足够了,因为它存储在对象数据中.为了做到这一点,我需要serialVersionUID从序列化数据中读取.