Java 在实现Serializable的类中声明私有静态final long SerialVersionId=xxxxxxxx L有什么区别

Java 在实现Serializable的类中声明私有静态final long SerialVersionId=xxxxxxxx L有什么区别,java,serialization,Java,Serialization,声明private static final long serialVersionUID=1945670924947820279L的效果如何在实现可序列化的类中 我记得可以在不指定long的情况下实现该类,或者只实现1L。有什么区别 import java.io.Serializable; public class KAS implements Serializable { private static final long serialVersionUID = 1945670924

声明
private static final long serialVersionUID=1945670924947820279L的效果如何在实现可序列化的类中

我记得可以在不指定long的情况下实现该类,或者只实现
1L
。有什么区别

import java.io.Serializable;

public class KAS implements Serializable
{ 
    private static final long serialVersionUID = 1945670924947820279L;
}

如果希望安全地反序列化/序列化实例,则类的每个版本都需要一个唯一的
serialVersionUID
。反序列化过程在反序列化时检查此值-如果它与异常不匹配,则引发异常,以防止序列化数据反序列化到错误版本的类中


如果将
serialVersionUID
设置为始终相同的值,则最好不要设置该值。

如果不指定版本,JVM将使用一些内部规则自行尝试确定序列化对象及其类加载器中的版本是否兼容。这可能会导致这样一种情况:有人有一个过时的jar,但反序列化仍然有效,因为类的较新版本没有以一种被视为不兼容的方式对其进行更改。(可能您修复了方法实现中的一个bug,但保留了所有字段。)


或者,如果您希望过时版本的用户仍然能够使用数据,您可以通过将值设置为1这样的操作来利用它。

实际上,您可以在不提供serialVersionUID的情况下成功地序列化/反序列化-编译器会根据类中的字段自动为您添加一个serialVersionUID。该值也不需要是“唯一的”。它的主要用途是,如果试图将实例反序列化为“不兼容”(即不同的serialVersionUID)类定义,则会引发异常。大多数人不再真正关心这一点,因为现在通常使用O/R映射工具来完成对长寿命持久性的序列化。但也有一些重要的用例,这个答案完全是错误的。如果不提供JVM,JVM将自己计算。提供它的原因是为了控制它,而不仅仅是为了满足JVM@jkraybill编译器没有提供,JVM提供。@EJP-谢谢你的更正,我显然有点生疏了!:)还值得注意的是,序列化对象不会序列化除此之外的任何静态字段。