RPC原理(2)

序列化与反序列化

正如前面说说,序列化和反序列化是由对象到字节流的转化过程和逆过程,在JAVA中最简单的实现序列化和返序列化的方式试实现Serializable接口,并为对象添加serialVersionUID来定制序列化的兼容方式。默认的序列化的原理大致如下:

序列化过程
Created with Raphaël 2.1.0Start获取当前类写入当前类名称便历类的每一个属性基础类型(String..)?写入基础属性是否是最外层对象Endyesnoyesno

简单来说对于简单对象的处理较为简单,只需要在写入字节之前加入开始标示,然后在写入字节后加入结束标示,中间就是将简单对象转化为字节码,对于string还要写入长度。对于复杂的对象要进一步写入对象的名称和对象的开始和结束标示。经过不断的递归调用就可以完成序列化的工作。
反序列化的就是上面过程的逆过程。

常用的序列化方式

json相关的如jackson,跨语言支持的如protobuf和messagepack,高性能的序列化框架kryo,fst等,protobuf的使用需要专用的插件成成对应的代码并编写对应的proto文件,kryo和fst要想保持高性能也要进行类的注册,另外不同的序列化方式所支持的兼容方式也不太一样。各种不同的序列化方式在流程上类似,不过一般的序列化框架在性能上都优于jdk默认的序列化方式,并且体积一般小于jdk序列化出来的体积。

可读性

json和xml方式的序列化通常拥有较高的可读性,这就意味着在数据的传输过程中很容易通过打印日志获得传输的内容,同时又有一定的格式要求,出现问题较容易发现,不过这两种方式序列化出来的对象都比较大,因为多存了很多符号。protocol buffer 和kryo等二进制协议的序列化框架牺牲了可读性,获得了性能上的提升。

兼容性

一般的系统都会有一定兼容性的需求,对于RPC来说,某个接口新增了一个字段是很正常的,一般需要向后兼容,一般的序列化方式都能提供部分的兼容,如fst可以通过@version提供简单的新增字段兼容,即新代码可以兼容旧的字段,protocol buffer可以提供optional进行兼容。在RPC通信中如果无法通过兼容性升级,可以通过服务的灰度发布使得多版本并存实现不兼容的升级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值