serialVersionUID缺少时,Eclipse会发出警告.
可序列化类Foo不声明long类型的静态最终serialVersionUID字段
serialVersionUID它是什么以及为什么重要?请显示缺失serialVersionUID会导致问题的示例.
如何在IntelliJ IDEA中生成此值?
我转到设置 - > 错误 - > 序列化问题 - >没有'serialVersionUID'的Serializable类,但它仍然没有显示警告.我的类PKladrBuilding父实现接口Serializable.
部分代码:
public class PKladrBuilding extends PRQObject
public abstract class PRQObject extends PObject
public abstract class PObject implements Serializable
Run Code Online (Sandbox Code Playgroud) 我正在扩展一个实现Serializable接口的类(ArrayBlockingQueue).Sun的文档(和我的IDE)告诉我,我应该设置这个值以防止恶作剧:
但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化期间可能导致意外的InvalidClassExceptions.
现在,我不在乎放在那里的价值.有关系吗?
class A implements Serializable{
private static final long serialVersionUID = 5L;
...
}
Run Code Online (Sandbox Code Playgroud)
和
class B implements Serializable{
private static final long serialVersionUID = 6L;
...
}
Run Code Online (Sandbox Code Playgroud)
那么有必要给serialVersionUID这两个类赋予独特性.
那么我可以分配serialVersionUID = 5L两个班级吗?
我读了以下链接
编辑:随机我的意思是一个大的计算数字,对我们作为开发人员没有语义含义
实现Serializable接口时,最佳做法是指定串行版本UID非常重要.在很多地方,我经常看到使用随机数字.例如
Effective Java(第2版)第312页:
private static final long serialVersionUID = 234098243823485285L;
Run Code Online (Sandbox Code Playgroud)
从Java 6中的String类:
private static final long serialVersionUID = -6849794470754667710L;
Run Code Online (Sandbox Code Playgroud)
从Java 6中的ArrayList类:
private static final long serialVersionUID = 8683452581122892189L;
Run Code Online (Sandbox Code Playgroud)
甚至eclipse提供了生成这些随机数的选项(尽管主要的默认值似乎是生成serialVersionUID 1L)
为什么要使用随机数?从1L开始并且当它像任何合理的版本控制一样变化时增加到2L是不是更有意义?我唯一能想到使用看似随机的数字的方法是,如果您没有指定serialVersionUID,并且现在想要这样做(这会将您绑定到运行时自动生成的版本以提供向后兼容性支持).
我与一位同事讨论了可序列化类的serialVersionUID:他总是从a开始,serialVersionUID = 1L然后在对类进行一些重大更改时将其递增1.
JDK类似乎总是在类中使用更复杂的生成的serialVersionUID java.lang.String:
private static final long serialVersionUID = -6849794470754667710L;
Run Code Online (Sandbox Code Playgroud)
现在,我的同事询问这种serialVersionUID与简单的serialVersionUID(如1L,2L,3L ......)相比的优势?
我们还搜索了SOF,但对给出的答案不是很满意,例如在为什么生成long serialVersionUID而不是简单的1L?.
在我看来,使用生成的ID的优点是它不需要任何有关"旧"类版本的信息.但是当手动递增ID时,您必须知道到目前为止的最高值.这可能听起来微不足道(通过查看当前的serialVersionUID并将其增加1),但在更大的软件项目,更大的开发团队或分布式环境中可能更复杂.
我有两个实现Serializable的java类.我将它们都设置为1L的serialVersionUid.
同事说所有类必须具有唯一的串行版本uid,并且如果jvm具有相同的串行版本uid,则jvm将把类视为相等.我认为相等是基于equals方法的结果而不是串行版本uid.
我的理解是,串行版本uid用于指示类的版本,并且当类以不兼容的方式更改时,串行版本的uid应该递增.
那是对的吗?是否可以使用1的serialversion uid?或者java类从来没有1L的serialversion uid?
这个问题与以下内容完全相同:
具有讽刺意味的是,Michael Bogswardt也回答道.
Michael Bogswardt对生成serialVersionUID的回答让我思考.有没有理由生成像eclipse和IDEA(或简单的serialver)这样的正确的serialVersionUID?或插入1L一样好?