1、简介

Protocol Buffers(简称protobuf)是google (谷歌)的一项技术,它跟JSON,XML一样,是一个规定好的数据传播格式。用于将结构化的数据序列化、反序列化,经常用于网络传输。

类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差。类似的还有json、Java的Serializable等。

protobuf支持各种语言:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。

由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

2、性能对比

protobuf kryo hessian的区别 protostuff和protobuf_数据

protobuf kryo hessian的区别 protostuff和protobuf_数据_02

protobuf kryo hessian的区别 protostuff和protobuf_反序列化_03

从上面的对比中可以看出 protobuf的序列化和反序列化的效率非常的高

3、应用场景

我们在开发一些RPC调用的程序时,通常会涉及到对象的序列化/反序列化的问题,比如一个“Person”对象从Client端通过TCP方式发送到Server端;因为TCP协议(UDP等这种低级协议)只能发送字节流,所以需要应用层将Java对象序列化成字节流,数据接收端再反序列化成Java对象即可。

序列化”一定会涉及到编码(encoding,format),目前我们可选择的编码方式:

  • 1)使用JSON,将java对象转换成JSON结构化字符串。在web应用、移动开发方面等,基于Http协议下,这是常用的,因为JSON的可读性较强。性能稍差。
  • 2)基于XML,和JSON一样,数据在序列化成字节流之前,都转换成字符串。可读性强,性能差,异构系统、open api类型的应用中常用。
  • 3)使用JAVA内置的编码和序列化机制,可移植性强,性能稍差。无法跨平台(语言)。
  • 4)其他开源的序列化/反序列化框架,比如Apache Avro,Apache Thrift,这两个框架和Protobuf相比,性能非常接近,而且设计原理如出一辙;其中Avro在大数据存储(RPC数据交换,本地存储)时比较常用;Thrift的亮点在于内置了RPC机制,所以在开发一些RPC交互式应用时,Client和Server端的开发与部署都非常简单。

评价一个序列化框架的优缺点,大概有2个方面:
- 1)结果数据大小,原则上说,序列化后的数据尺寸越小,传输效率越高。
- 2)结构复杂度,这会影响序列化/反序列化的效率,结构越复杂,越耗时。

结论:
Protobuf是一个高性能、易扩展的序列化框架,它的性能测试有关数据可以参看官方文档。通常在TCP Socket通讯(RPC调用)相关的应用中使用;它本身非常简单,易于开发,而且结合Netty框架可以非常便捷的实现一个RPC应用程序,同时Netty也为Protobuf解决了有关Socket通讯中“半包、粘包”等问题(反序列化时,字节成帧)。