为什么需要序列化与serialVersionUID

为什么需要序列化与serialVersionUID

1、序列化

§ 用途:

  • 把对象序列化成字节码,保存到指定介质上(如磁盘等)
  • 用于网络传输

被序列化的实例所属类需要实现Serializable接口:


2、serialVersionUID

serialVersionUID适用于Java的序列化机制。

简单来说,Java的序列化机制是**通过判断类的serialVersionUID来验证版本一致性的**。

在进行反序列化时,JVM会把传来的**字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较**,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是==InvalidCastException==。

具体的序列化过程是这样的:序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。


3、为什么建议显式指定serialVersionUID?

举例说明:

假设我们有一个Person类,我们进行如下操作:

  1. 先将其序列化到本地。然后再反序列化。(正常)
  2. 我们给Person类增加一个字段后,不修改UID,这时,再反序列化。(正常)(兼容)
  3. 但如果增加字段后修改了UID,则反序列化时由于JVM监测到字节流中的serialVersionUID与当前Person类中的不同,抛出异常。

由此可知:

serialVersionUID 就是控制版本是否兼容的,若我们认为修改的 Person 是向后兼容的,则不修改 serialVersionUID;反之,则提高 serialVersionUID的值。

​ **若不显式定义 serialVersionUID 的值,Java 会根据类细节自动生成 serialVersionUID 的值,如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。**这样就无法做到版本兼容了。

生成serialVersionUID在idea中有一个插件:GenerateSerialVersionUID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值