C++Protocol Buffers的用

  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