1. Protocol Buffers的介绍

Protocol buffers are Google’s language-neutral, platform-neutral,
extensible mechanism for serializing structured data – think XML, but
smaller, faster, and simpler
. You define how you want your data to be
structured once, then you can use special generated source code to
easily write and read your structured data to and from a variety of data
streams and using a variety of languages – Java, C++, or Python. You can
even update your data structure without breaking deployed programs that
are compiled against the “old” format.(摘自Protocol
Buffers官网)

protocol
buffers是google提供的平种植将结构化数据开展序列化和反序列化的法门,其亮点是言语中立,平台中立,可扩展性好,目前于google内部大量用于数据存储,通讯协议相当于地方。Protocol
Buffers在效能上接近XML,但是序列化后底多寡再次粗,解析更快,使用及重新简单。用户如果按照proto语法在.proto文件被定义好数据的布局,就好采用Protocol
Buffers提供的工具(protoc)自动生成处理数据的代码,使用这些代码就可知以次中有益的经各种数据流读写多少。PB目前支持Java,
C++和Python3栽语言。另外,Protocol
Buffers还提供了酷好之往后相当,即原本子的程序可以正常处理新本子的数,新本子的先后吗会健康处理旧本子的数额。

Protocol Buffers具有以下特点:

  1. 阳台无关、语言无关
  2. 高性能 比XML块20-100倍
  3. 体积小 比XML小3-10倍
  4. 采用简便
  5. 兼容性好

2、message的编码特点

Protocol Buffers
之所以解析速度快、所占有体积小,很老程度达是由于其序列化的编码特点来决定的。

2.1 Base 128 Varints

Protocol Buffers采用了Base 128 Varints来转换长编码整数:

  1. 变长编码的平头,它恐怕带有多个byte,对于每个byte的8各项,其中后7各代表数值,最高的同等个代表是否还有还起另外一个byte,0意味尚无,1意味有;
  2. 逾前面的byte表示数值的不如,越后面的byte表示数值的要职;

例子:
300 varints 编码为:1010 1100 0000 0010
分解如下:
300之2迈入制编码为:0001 0010 1100
照刚才底规则,高低位颠倒,截取最后的7乎身处第一个byte,则率先byte为1010
1100(其中最高位1象征,后续还有byte);接着剩下的始末放到第二单byte,为0000
0010(其中最高位0表示,后续无byte,这个累及此地了了)。
于是,合在一起为 1010 1100 0000 0010;

2.2 Key-Value

如前所述,Protocol
Buffers的message是一模一样系列之key-value对,在二进制数据遭到,使用varints数字(包含了号以及性能类型信息)来当key,进而通过由PB编译器生成的代码来布局与解析数据。
Protocol Buffers将 key编码成下面的构造:
X YYYY ZZZ
里面:最高位X表示是否还有继续的byte来编码数字别名;YYYY用于编码别名,定义了剩下16只属性,则需因此到额外的byte,所以出现频率高的字段应当取1-16的号);ZZZ表示这字段的门类,PB支持之性之附和规则如下表:

Type Meaning Used For
0 Varint int32, int64, uint32, uint64, sint32,sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded messages,packed repeated fields
3 Start group groups (deprecated)
4 End group groups (deprecated)
5 32-bit fixed32, sfixed32, floa

说明2:PB 属性对应规则
例子:
required int32 a=1; 在运中给a赋值150 ,序列化后08 96 01

  • 08象征的凡key 0 0001 000,
    最高位吗0,表示这个key为一个byte,中间四个表示a的数字别名,最后三位表示a的性质类型;
  • 96 01意味的凡value,二进制为:1001 0110 0000 0001
    → 001 0110 000 0001(去丢最高位)
    → 22 + 1*2^7 = 150

2.3 Zig-Zag

动varints的措施编码有记号的平头,效率比较不同,因为负数的极致高位是1,这样即使导致了情况类似于编码一个要命特别的多次。

以缓解者问题,Protocol
Buffers定义了sint32/sint64属性,他们采取了“之许显得”(ZigZag)编码的道,将负数编码成正数,交替进行。看了下表就非常好明了:

Signed Original Encoded As
0 0
-1 1
1 2
-2 3
2147483647 4294967294
2147483648 4294967295

申3:Zig-Zag编码规则

运用是方式,可以使得地节约存储空间,也克加强解析效率。了解了以上内容,对于其它数据类型的编码,也是死好掌握的,大家可以参见官方文档,这里不开详述。

3.怎么不用XML?

ProtocolBuffer拥有多桩于XML更尖端的差行化结构数据的风味,ProtocolBuffer:

· 更简单

· 小3-10倍

· 快20-100倍

· 更少的歧义

· 可以便宜之变数据存取类

诸如,让咱们看看如何在XML中建模Person的name和email字段:

<person>
<name>John Doe</name>
<email>jdoe@example.com</email>
</person>

相应的ProtocolBuffer报文则如下:

#ProtocolBuffer的文件表示
#顿时不是健康时行使的二进制数据
person {
name: “John Doe”
email: “jdoe@example.com
}

当这个报文编码到ProtocolBuffer的亚上前制格式(
http://code.google.com/apis/protocolbuffers/docs/encoding.html
)时(上面的文书仅用于调试和编排),它独自待28字节和100-200ns的辨析时。而XML的本需要69字节(除去空白)和5000-10000ns的分析时。

自,操作ProtocolBuffer也异常简短:

cout << “Name: ” << person.name() << endl;
cout << “E-mail: ” << person.email() << endl;

假使XML的乃待:

cout << “Name: “
<<
person.getElementsByTagName(“name”)->item(0)->innerText()
<< endl;
cout << “E-mail: “
<<
person.getElementsByTagName(“email”)->item(0)->innerText()
<< end;

当,ProtocolBuffer并无是在其他时刻都比较XML更确切,例如ProtocolBuffer无法对一个冲标记文本的文档建模,因为若从来没法方便之于文书中插结构。另外,XML是惠及人类阅读和编辑的,而ProtocolBuffer则未是。还有XML是自从说的,而
ProtocolBuffer仅在您具备报文格式定义的 .proto 文件时才来意义。

 

连锁文章:

.net自带二上前制序列化,XML序列化和ProtoBuf序列化的压缩对比

WCF服务及采取protobuf

玩转Protocol
Buffers

Beetle使用Protobuf.net进行对象序列化传输

Google Protocol Buffer
的施用及公理

Protocol Buffers and WCF
http://blogs.msdn.com/b/dmetzgar/archive/2011/03/29/protocol-buffers-and-wcf.aspx

Protobuf-net: the unofficial manual
http://www.codeproject.com/Articles/642677/Protobuf-net-the-unofficial-manual

Working with Protobuf WCF Services
http://www.drdobbs.com/windows/working-with-protobuf-wcf-services/240159282?pgno=1

 

相关文章

网站地图xml地图