0%

日常解惑-Java类中的serialVersionUID是什么

前情

看代码的时候,发现很多类中有一个静态常量:

1
private static final long serialVersionUID = 1L;

这个静态的常量是用来干什么的呢?

翻译

提问

在Stack Overflow上面也有对应的问题

Eclipse issues warnings when a serialVersionUID is missing.

The serializable class Foo does not declare a static final serialVersionUID field of type long

What is serialVersionUID and why is it important? Please show an example where missing serialVersionUID will cause a problem.

当缺少这个常量的时候,Eclipse会进行警告,那么这个常量究竟是什么,它为什么重要呢?

回答

java.io.Serializable 接口的文档很好的说明了这一点:

在运行序列化的时候,会将每个可序列化类与一个称为 serialVersionUID 的版本号相关联,在反序列化期间使用它来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。

如果接收方为对象加载了一个与相应发送方类具有不同 serialVersionUID 的类,则反序列化将导致 InvalidClassException。 可序列化的类可以通过声明一个名为 serialVersionUID 的字段来显式声明它自己的 serialVersionUID,该字段必须是静态的、最终的且类型为 long

就算你自己没有提供这个,JVM也会为你的类生成一个,但是这样的话会因为不同的 JVM 而有所差异,可能导致InvalidClassException的发生。所以非常推荐自己在类中定义一个。