原文连接:http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
1.ProtocolBuffers是啥
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
2.ProtocolBuffers 的有点
XML的自我解析性很强,也就是看了这个字段,就知道这个字段是啥意思,Json的解析框架很多,可阅读性虽然不如XML,拓展性也不如XML,但是解析起来方便,目前Android端有Gson FastJson等一大片的解析框架,相对与XML的解析会更加的简单快捷,虽然损失了阅读性能,作为目前移动端跟服务器交互的主流数据格式,protocolBuffer有哪些优点呢?
3.ProtocolBuffer的优点
protocolBuffer的优点就是快,快主要体现在什么地方呢?假设你创建一个对象,将对象序列化为内存中的字节序列,在后再反序列化出来,当然一次的操作可能看出来的差距会比较小,就像假设这个操作是0.1的话,一个是0.2s 的话,这些时间上的差距,可能用肉眼根本就没办法区分哪个的速度会更快一些,但是重复操作上千次,上万次之后,你就会发现时间的差距了,用累计法可以计算,在数据的传输过程中,需要多次进行序列化与反序列化,那么时间差距就出来了,protocolBuffer它以高效的二进制方式存储,比XML体积要小3-10倍,比XML的速度要快20-100倍。
4.protocolBuffer为啥会比Java的序列化要快很多
为啥protocolBuffer会比XML小很多跟快很多,这个要从protocolBuffer的封包与解包说起,先说封包的过程吧,也就是发送数据的时候,Encoding的过程,Varint 是一种紧凑的数字表示方法,它用一个字节或多个字节来表示一个数字,值越小的数字,使用越少的字节数,这能减少表示数字的字节数,比如一个int32 类型的数字,一般需要4个byte 来表示,但是如果使用Varint的话,则可以用一个Byte来表示,这样不好的地方在于如果是大的数字的话,可能会使用5Byte来表示,当然一般在数字中不可能全部出现都是大数的情况
Varint的每个最高位的bit 有特殊的意义,如果最高位bit 为1的话则表示后续的Byte 也是该数字的一部分,反之最高位bit 如果为0的话,则后续的数字不是改数字的一部分,这样就会减少很多的空间,让数字的表示,每位bit 都能够能近其所用,数字的表示更加的紧密,这就是为什么体积更小的原因
封包的速度
首先了解下XML的封包的过程,XML需要从文件中读取字符串,在转换成XML文档对象结构模型,之后再从XML文档对象结构模型中读取指定节点的字符串,然后再将这些字符串转换成指定类型变量,这个过程非常的复杂。其中将XML转换成文档对象结构模型的过程需要完成词法与文法分析等大量耗费CPU的工作
反观protocolBuffer只需要将一个简单的二进制序列,按照指定的格式读取到C++对应的结构类型中就可以了
任何东西存在都会有它的可行性,就像JSON XML 之类的通信格式,如果某个东西,存在的是一无是处的话,慢慢的肯定会被淘汰,就像生物进化论一般,各有各自的优点与缺点,按照自己的需求选取可行的方案才是最合适的,不过个人觉得ProtocolBuffer协议有些难懂,对于菜鸟级别的码农刚开始接触的时候,会有些难以理解,而且如果数据格式错误的话,可能会倒置不知道是服务器的错误还是客户端的错误,因为这个根本没办法通过抓包来确定是哪个地方出问题了。