探析“Java序列化”之serialVersionUID

未显式指定serialVersionUID

当没有显式地定义serialVersionUID变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本,它通过类名,方法名等诸多因素经过计算而得,和类名、实例方法名、实例属性名等有关,和静态属性名和值、实例属性值无关。

这种情况下,如果class文件(类名,方法名等)没有发生变化(增加空格,换行,增加注释,等等),就算编译再多次,serialVersionUID也不会变化的。但一旦变化,那么在反序列化时就会出现序列化版本不一致的异常InvalidCastException

反序列化过程

  1. 首先,载入需要反序列化的byte[]数组,并解析出类名全路径,jvm会使用URLClassLoader去找本虚拟机中是否加载过这样类名的一个类;

  2. 如果有,计算这个类的serialVersionUID值(如果显示声明了就不用计算,直接用),再和byte[]数组中的serialVersionUID对比,不相同报出异常;

  3. 当相同时,根据刚刚得到的类名全路径newInstance一个对象出来,然后使用反射将byte内容一一复制给该对象,最后返回该对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值