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. 包容性好

二 、message的编码特点

Protocol Buffers
之所以解析速度快、所占容量小,很大程度上是由它连串化的编码特点来支配的。

2.1 Base 128 Varints

Protocol Buffers选用了Base 128 Varints来变长编码整数:

  1. 变长编码的整数,它或然带有多少个byte,对于逐个byte的柒人,其中后五个人表示数值,最高的一个人代表是不是还有还有另壹个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用于编码别名,定义了剩余拾陆个脾性,则必要用到额外的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,中间3个人表示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字节(除去空白)和六千-一千0ns的解析时间。

自然,操作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()
XML,<< end;

当然,ProtocolBuffer并不是在其他时候都比XML更适合,例如ProtocolBuffer不能对三个根据标记文本的文档建模,因为您根本没办法方便的在文件中插入结构。此外,XML是便民人类阅读和编辑的,而ProtocolBuffer则不是。还有XML是自解释的,而
ProtocolBuffer仅在您抱有报文格式定义的 .proto 文件时才有意义。

 

连锁小说:

.net自带二进制系列化,XML连串化和ProtoBuf种类化的收缩比较

WCF服务上选用protobuf

玩转Protocol
Buffers

Beetle使用Protobuf.net进行对象体系化传输

谷歌 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地图