Java技术:SerialVersionUID作用介绍

1.serialVersionUID概念介绍

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

成都创新互联公司成都网站建设按需定制网站,是成都网站营销公司,为成都玻璃钢雕塑提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站设计热线:18982081108

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

当前名称:Java技术:SerialVersionUID作用介绍
网站URL:http://www.shufengxianlan.com/qtweb/news15/40315.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联