Java技术:SerialVersionUID作用介绍

开发 后端
英文翻译的意思是序列化版本号。凡是实现Serializable接口的类都会有一个表示序列化版本标识符的静态变量。

\[[402324]]

1.serialVersionUID概念介绍

英文翻译的意思是序列化版本号。凡是实现Serializable接口的类都会有一个表示序列化版本标识符的静态变量。

2.serialVersionUID的生成方式

默认的1L:比如:private static final long serialVersionUID = 1L; 。

根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段:

比如:

private static final long serialVersionUID = 3959055215634785113L;

3.serialVersionUID原理

当定义一个实体类中如果没有显式的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。比如,当我们编写一个Java类时,随着时间的推移,因为需求的改动,需要在该Java类中添加新的的字段,这个时候再反序列化时就会出现serialVersionUID不一致的情况,从而导致反序列化失败。可以通过在本地Java类中添加一个“serialVersionUID”变量,值保持不变,便可以进行序列化和反序列化。如果Java类没有显示指定serialVersionUID,JVM会自动生成一个。

4、serialVersionUID作用

序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

5、serialVersionUID注意事项

 

  • 当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本中未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。
  • 记住应该总是在可序列化的类中包含这个字段,即使是在第一个类版本中,以便提醒自己这个字段的重要性。不要在未来的版本中改变这个字段值,除非你有意要改变类使其与旧的序列化对象不兼容。
  • 如果你的类序列化到硬盘上面后,你更改了类别的field(增加或减少或改名),当你反序列化时,就会出现异常的,这样就会造成不兼容性的问题。但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。
  • 当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。但如果在开发大量需要序列化的类的时候,建议还原为原来的设置。这样可以保证系统的性能和健壮。

本文转载自微信公众号「IT技术分享社区」,可以通过以下二维码关注。转载本文请联系IT技术分享社区公众号。

原文链接:https://mp.weixin.qq.com/s/gNmgJcTULeFYFVrBRqkTYA

 

责任编辑:武晓燕 来源: IT技术分享社区
相关推荐

2021-03-01 12:40:02

JavaserialVersi代码

2011-07-11 16:55:31

Java

2011-07-22 16:37:01

java接口

2009-12-25 16:09:14

NGN用户接入技术

2011-07-22 13:00:46

java

2012-07-30 13:15:58

EVB

2009-12-28 14:05:33

ACL控制

2020-12-30 05:33:30

Java网络数据

2009-07-02 10:27:20

JSP技术JSP入门

2009-07-02 12:56:01

JSP技术

2009-06-29 14:30:27

JSF技术

2023-12-10 16:48:00

Wasm浏览器

2010-03-15 14:41:59

2009-07-03 22:16:19

机房综合布线

2009-07-10 14:41:57

Swing技术

2010-04-21 17:53:09

负载均衡技术

2011-07-11 10:00:34

PHP缓存技术

2010-04-12 15:35:42

2011-05-24 13:57:25

2022-10-21 10:48:17

消息中间件互联网应用协议
点赞
收藏

51CTO技术栈公众号