数据交换格式在 RPC 中也叫做序列化格式。常用的序列化有 JSON/Protobuf/Hes sian 等,评价序列化优劣一般从三个维度: 序列化后的字节数组大小 序列化和反序列化速度 序列化后的可读性 协议在选取序列化方式时,按照具体的需求在这三个维度中互相取舍。序列化后的数组 越小,越节省网络流量,但序列化过程可能更消耗时间。JSON\XML 这类基于文本的序 列化方式往往更容易被开发者接受,因为相比于一连传的字节数组,文本更容易被理解,在 各层设备中都能比较容易的识别,但可读性提高的后果是性能大幅降低。
1.1 定义
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据 1.2 序列化的目的
通过序列化以字节流的形式使对象在网络中进行传递和接收
永久性保存对象,保存对象的字节序列到本地文件或者数据库中
通过序列化在进程间传递对象
深拷贝对象
跨语言传递数据
只要让类实现 Serializable 接口就行,序列化具体的实现是由ObjectOutputStream和ObjectInputStream来实现的 缺点: 1:序列化码流太大 2:序列化效率低 3:无法跨语言 优点: 1:简单
JSON 可能是我们最熟悉的一种序列化格式了,JSON 是典型的 Key-Value 方式,没有数据类型,是一种文本型序列化框架,JSON 的具体格式和特性,网上相关的资料非常多,这里就不再介绍了。他在应用上还是很广泛的,无论是前台 Web 用 Ajax 调用、用磁盘存储文本类型的数据,还是基于 HTTP 协议的 RPC 框架通信,都会选择 JSON 格式。 缺点: 1:JSON进行序列化的额外空间开销比较大,对于大数据量服务就意味着需要巨大的内存和磁盘开销 2:JSON没有类型,但像Java这种强类型语言,需要通过反射统一解决,所以性能不会太好 优点: 1:简洁明了
Hessian 是动态类型、二进制、紧凑的,并且可跨语言移植的一种序列化框架。Hessian 协议要比 JDK、JSON 更加紧凑,性能上要比 JDK、JSON 序列化高效很多,而且生成的字节数也更小 Student student = new Student(); student.setNo(101);
student.setName("HESSIAN"); //把student对象转化为byte数组 ByteArrayOutputStream bos = new ByteArrayOutputStream(); Hessian2Output output = new Hessian2Output(bos); output.writeObject(student); output.flushBuffer(); byte[] data = bos.toByteArray(); bos.close(); //把刚才序列化出来的byte数组转化为student对象 ByteArrayInputStream bis = new ByteArrayInputStream(data); Hessian2Input input = new Hessian2Input(bis); Student deStudent = (Student) input.readObject(); input.close(); System.out.println(deStudent);复制代码 缺点: 1:官方版本对Java里面一些常见对象的类型不支持, 比如LinkedHashMap、LinkedHashSet 等,但是可以通过扩展CollectionDeserializer 类修复, Locale 类,可以通过扩展 ContextSerializerFactory 类修复; Byte/Short 反序列化的时候变成 Integer 优点: 1:相对于JDk,JSON,更加高效,生成的字节数更小 2:有非常好的兼容性和稳定性
Protobuf 是 Google 公司内部的混合语言数据标准,是一种轻便、高效的结构化数据存储格式,可以用于结构化数据序列化,支持 Java、Python、C++、Go 等语言。Protobuf使用的时候需要定义 IDL(Interface description language),然后使用不同语言的 IDL编译器,生成序列化工具类 缺点: 1:为了提高性能,protobuf采用了二进制格式进行编码。这直接导致了可读性差 2:对于具有反射和动态语言来讲,用起来比较费劲 优点: 1:高效 2:支持多种语言 3:支持向前,向后兼容
Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式,用户通过Thrift的IDL(接口定义语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。 缺点: 1:没有官方文档 2:Thrift序列化二进制不可读,调试困难 3:buf fix 和更新不积极,维护成本过高 4:RPC 在 0.6.1 升级到 0.7.0 是不兼容的 优点: 1:特性丰富 2:性能不错 3:有很多开源项目的周边支持 都是 thrift
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。