当前位置: 首页 > 科技观察

Java技术:SerialVersionUID的作用介绍

时间:2023-03-13 14:48:31 科技观察

\1.serialVersionUID概念介绍英文翻译意思是序列化的版本号。所有实现Serializable接口的类都将有一个表示序列化版本标识符的静态变量。2.默认生成serialVersionUID的方法是1L:例如:privatestaticfinallongserialVersionUID=1L;根据类名、接口名、成员方法和属性等生成一个64位的哈希字段:例如:privatestaticfinallongserialVersionUID=3959055215634785113L;3.serialVersionUID的原理在定义一个实体类时,如果没有显式定义一个名称当它是一个“serialVersionUID”类型为long的变量时,Java序列化机制会根据编译后的类自动生成一个serialVersionUID作为序列化版本比较。在这种情况下,只有同一编译生成的类才会生成相同的serialVersionUID。比如我们写一个Java类,随着时间的推移,由于需求的变化,需要在Java类中增加新的字段。这时候反序列化的时候会出现serialVersionUID不一致,导致Deserializationfailed。可以通过在本地Java类中添加一个“serialVersionUID”变量来进行序列化和反序列化,该值保持不变。如果Java类没有显式指定serialVersionUID,JVM将自动生成一个。4、serialVersionUID的作用是在序列化时保持版本兼容性,即版本升级时反序列化仍然保持对象的唯一性。5.serialVersionUID注意事项当实现了java.io.Serializable接口的实体(类)没有显式定义一个名为serialVersionUID的long类型的变量时,Java序列化机制会根据编译后的类自动生成一个serialVersionUID作为一个sequence它用于比较优化版本。在这种情况下,只有同一次编译生成的类才会生成相同的serialVersionUID。如果我们不想通过编译来强制划分软件版本,即实现序列化接口的实体可以兼容之前版本没有改变的类,我们需要显式定义一个变量名为serialVersionUID,类型为long,不修改这个变量值的序列化实体,都可以相互序列化和反序列化。请记住始终将此字段包含在可序列化类中,即使是在类的第一个版本中,以提醒自己此字段的重要性。不要在未来的版本中更改此字段值,除非您有意将类更改为与旧的可序列化对象不兼容。如果你的类是序列化到硬盘上的,你改变了类的字段(增加或减少或重命名),当你反序列化时,就会出现异常,从而导致不兼容的问题。但是当serialVersionUID相同的时候,会把不同的字段反序列化成type的默认值,这样可以避免不兼容的问题。当我们的系统不需要经常序列化类时,我们可以去掉这些警告,进行如下设置:Window-->Preferences-->Java,将serializableclasswithoutserialVersionUID的设置从warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息就会消失。但是,如果你是开发大量需要序列化的类,建议恢复原来的设置。这确保了系统的性能和健壮性。本文转载自微信公众号“IT技术分享社区”,可通过以下二维码关注。转载本文请联系IT技术分享社区公众号。原文链接:https://mp.weixin.qq.com/s/gNmgJcTULeFYFVrBRqkTYA