请问“serialVersionUID”是干什么用的?

EDDGA 2010-12-29 12:03:27
没写一个新类,eclipse都提示我声明这个,按照提示点了,就有如下:

private static final long serialVersionUID = 1457142034245492583L;


请问这是干什么用的,貌似不加这个也能跑起来
...全文
279 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
plusplus2010 2010-12-29
  • 打赏
  • 举报
回复
序列化通常是用来传输对象的。传输就有发送方和接收方。为保证正确性,这两方必须使用同一个class来序列化和反序列化一个对象。可是,如果两方使用同一个class的不同版本(名字相同,成员和方法不同)怎么办?所以java要求每个Serializable的类都有一个serialVersionUID。原则上,每次修改类的时候都应该增加或改变这个serialVersionUID。这样,如果接收方用的是旧的版本,java就会报错:InvalidClassException。

如果不添加这个serialVersionUID,java的序列化机制会自动计算一个。自动计算的情况下,任何微细的,跟序列化无关的代码改动(比如添加一个空行)都会导致产生一个新的serialVerionUID。这个完全没有必要。因此,自动计算的没有程序员手工添加的好,所以eclipse强烈建议你添加一个。
EDDGA 2010-12-29
  • 打赏
  • 举报
回复
谢谢了
  • 打赏
  • 举报
回复
如果这对象是可序列化的,那么这个私有静态字段是为了版本控制而存在的一个版本号。

举个例子吧:

如果当前的 serialVersionUID 的值是 1,然后我们用 ObjectOutputStream 把这个对象写到文件中去。之后,我们把这个值由 1 改为 2,再用 ObjectInputStream 把这个对象读出来,这时就会抛出异常(这个异常:java.io.InvalidClassException,可以看看这个异常的 API doc),因为类的版本号不同了,因此反序列化程序会认为这个类已经被改变,无法被反序列化。

这篇文章说得比较详细,有兴趣的话可以去看看:

Understand the serialVersionUID
http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

另外,也可以看看 JDK 的文档:

Java Object Serialization Specification 的 4.6 节 Stream Unique Identifiers
http://download.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100
qian119110 2010-12-29
  • 打赏
  • 举报
回复
呵呵 没用过eclipse
看英文是序列版本UID

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧