分享

Java技术:serialVersionUID作用介绍

 IT技术分享社区 2022-10-20 发布于江苏

               

  1. serialVersionUID概念介绍

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

  1. serialVersionUID的生成方式

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

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

比如:      

private static final long serialVersionUID = 3959055215634785113L;

  1. serialVersionUID原理

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

4、serialVersionUID作用 

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

5、serialVersionUID注意事项

1.当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本中未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。 

2.记住应该总是在可序列化的类中包含这个字段,即使是在第一个类版本中,以便提醒自己这个字段的重要性。不要在未来的版本中改变这个字段值,除非你有意要改变类使其与旧的序列化对象不兼容。

3.如果你的类序列化到硬盘上面后,你更改了类别的field(增加或减少或改名),当你反序列化时,就会出现异常的,这样就会造成不兼容性的问题。但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。 

4.当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。但如果在开发大量需要序列化的类的时候,建议还原为原来的设置。这样可以保证系统的性能和健壮。

IT技术分享社区

个人博客网站:https://

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多