在实现Serializable的类中声明private static final serialVersionUID = xxxxxxxxL有什么区别

时间:2011-07-18 01:16:32

标签: java serialization

在实现Serializable的类中声明private static final long serialVersionUID = 1945670924947820279L;会产生什么影响?

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

import java.io.Serializable;

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

2 个答案:

答案 0 :(得分:3)

如果您没有指定版本,JVM将使用一些内部规则来尝试自行解决序列化对象和其自己的类加载器中的版本是否兼容。这可能导致某人有一个过时的jar但反序列化仍然有效的情况,因为该类的较新版本没有以一种被认为是不兼容的方式更改它。 (也许您修复了方法实现中的错误,但仅留下了所有字段。)

或者,您可以通过将值设置为1来执行此操作,并且如果您希望具有过期版本的人仍然能够使用该数据,则永远不会更改它。

答案 1 :(得分:1)

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

如果您使serialVersionUID始终具有相同的值,则可能没有它。