03 | 序列化:对象怎么在网络中传输?
何小锋
该思维导图由 AI 生成,仅供参考
你好,我是何小锋。上一讲我讲解了在 RPC 框架中,如何设计可扩展的、向后兼容的协议,其关键点就是利用好 Header 中的扩展字段以及 Payload 中的扩展字段,通过扩展字段向后兼容。
那么承接上一讲的一个重点,今天我会讲解下 RPC 框架中的序列化。要知道,在不同的场景下合理地选择序列化方式,对提升 RPC 框架整体的稳定性和性能是至关重要的。
为什么需要序列化?
首先,我们得知道什么是序列化与反序列化。
网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。 这时,服务提供方就可以正确地从二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象,这个过程我们称之为“反序列化”。
这两个过程如下图所示:
序列化与反序列化
总结来说,序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。
那么 RPC 框架为什么需要序列化呢?还是请你回想下 RPC 的通信流程:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
在RPC框架中选择合适的序列化方式至关重要。本文介绍了序列化的重要性以及常用的序列化方式,包括JDK原生序列化、JSON、Hessian和Protobuf。针对选择序列化方式时的考量因素,文章提到了性能、空间开销、通用性和兼容性等方面。此外,还强调了序列化协议的安全性对于选择的重要性。在使用RPC框架时,需要注意避免对象过于复杂、庞大,以及使用不受序列化框架支持的类作为入参类等问题。总结指出,Hessian与Protobuf是首选序列化方式,因为它们在多个方面都能满足需求。最后,读者被鼓励思考在RPC框架中选择序列化框架时还需要考虑哪些因素,以及了解更多适合在RPC调用中使用的优秀序列化框架。整体而言,本文深入浅出地介绍了序列化在RPC框架中的重要性和选择方式,为读者提供了全面的技术指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》,新⼈⾸单¥59
《RPC 实战与核心原理》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(49)
- 最新
- 精选
- 蚂蚁内推+vProtostuff对象属性,以及容器内元素都支持null吧,请问老师说的不支持是指在什么场景?
作者回复: 前几天刚看到最新发布的版本已经改进支持了,原来序列化对象数组空元素有问题。
2020-02-24344 - 楼下小黑哥我觉得可读性是否也该考虑。 总结下序列化协议可以分为两类 1.文本类序列化方式,如 xml,json。优点就是可读性好,构造方便,调试也简单。不过缺点也明显,传输体积大,性能差。 2.二进制类学序列化方式,如 Hessian,Protobuf,优点性能好。 查了下,其他序列化方式还有 Thrift,Avro。
作者回复: 是的。根据场景选择
2020-02-24730 - 小豆角如果要传输的数据只有一个字节,也不需要序列化了。凡是离开内存需要传输或者持久化的数据,都要先进行序列化。数据离开内存,进行io的时候,就应该学习序列化的概念了。序列化就是流化,数据转成字节流。这样认为对吗
作者回复: 可以
2020-02-2519 - 陈国林老师你好,请教一个问题。【如果RPC框架基于HTTP协议,并且使用JSON做为序列化协议。那么业务请求数据在网络传输的过程中是JSON格式还是二进制格式呢?或者说 OSI 7层网络模型是否会自动进行一些数据的序列化?】 谢谢~
作者回复: 所有的网络传输都是二进制,应用看见的是json是因为收到经过了反序列化
2020-02-241016 - NEVER SETTLE老师,我感觉这节将的序列化与反序列化,与上一节的协议很类似。可以说 protobuf既是序列化方式,也是协议。
作者回复: 序列化一般用在协议里面的payload里面
2020-03-22314 - 雨霖铃声声慢我感觉要序列化框架选型的时候也要考虑语言兼容性,比如有些应用是多语言的,那么就要考虑能够兼容多种语言的序列化框架, 比如protobuf就可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。 Kryo也是一种非常成熟的序列化实现,它的性能在各个方面都比hessian2要优秀些,但是Kryo不是线程安全,因此当希望使用Kryo构建的工具类时候,需要在实例化的时候注意线程安全的问题。
作者回复: 跨语言需求越来越多
2020-02-2529 - Sephiroth为什么没有说thrift呢?
作者回复: 也是有名的rpc和序列化
2020-02-249 - 来关于如何选择序列化协议: 1、常见的序列化协议有JDK、Hession、Protobuf、JSON、XML; 2、序列化协议的选择指标为序列化性能、序列化后数据大小、协议本身兼容性(协议版本上下兼容性,跨语言兼容性)、安全性。 这几种协议对比如下: 1、JSON、XML,可读性好,但是性能较差,序列化后占用空间大,序列化后数据无类型,需要反射才能获取对象类型; 2、JDK通过InputStream、OutputSteeam来序列化、反序列化,性能也比较差; 3、Hession、Protobuf性能都比较好,Hession对象兼容性更好,Protobuf更加高效。RPC框架一般选用这两种的比较多。
作者回复: 是的。
2020-03-2228 - Jackey想到了Redis使用的RESP,在做序列化时也是会增加很多冗余的字符,但它胜在实现简单、可读性强易于理解
作者回复: 很精简
2020-02-248 - JavaShare为什么JSON的额外开销大呢?是因为存在大量的换行吗
作者回复: 最明显的就是你说的数据包大,因为字符相对二进制更占空间
2020-04-2457
收起评论