hessian2与java序列化

首先看一个dubbo调用场景:

测试一:使用dubbo协议,没有配置系列化方式(缺省使用hessian2)

(1)如果此时将B应用中Hello对象添加一个参数,升级二方包,并B应用重新发布,A应用保持不变

这时候问题来了,这时候A调用B能正常调用吗? 答案是可以的


(2)将B应用中的serialVersionUID删除掉,重新打包发布

此时,通过A调用B也是正常的

 

测试二:将B应用中dubbo的协议的系列化方式修改为java

(1)如果此时将B应用中Hello对象添加一个参数,升级二方包,并B应用重新发布,A应用保持不变

这时候问题来了,这时候A调用B能正常调用吗? 答案是可以的


(2)将B应用中的serialVersionUID删除掉,重新编译打包发布

此时,通过A调用B报错

 

一、dubbo默认的系列化方式hessian2

我们从dubbo官网上可以看到这样一个参数介绍:(http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-protocol.html

从上面的测试中发现,hessian2可以兼容同一对象的不同版本,这可能是系列化实现方式跟java不一样。查阅一些博客发现这样描述

hessian在反序列化的时候,是将对象所有属性取出来,存放在一个map中 key = 属性名 value是反序列类

 

 

二、java系列化

       一般情况下,实现Serializable接口会默认的生成一个 private static final long serialVersionUID ,java在反系列化的时候会将字节流中的serialVersionUID与本地的serialVersionUID作对比,如果一直则说明是同一个对象,就可以反序列化,否则会出现版本不一致的异常。

隐式:

隐式就是不声明serialVersionUID,那么每次重新编译的时候calss会自动生成一个serialVersionUID做为版本比较使用,在这种场景下,只有同一次编译的calss文件serialVersionUID才相同

显式:

就是在类文件中声明一个serialVersionUID,不改变这个值,无论编译多少次,都可以进行系列化和反系列化操作。

结论:

如果使用java系列化的方式,我们尽可能的显示实现一个serialVersionUID

  1. 如果需要不同版本的对象传输兼容,则使用同一个serialVersionUID
  2. 如果需要做版本区分,则使用不同的serialVersionUID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值