您的位置:首页 > 其它

protobuf 理解

2016-01-12 15:04 621 查看
一、什么是protobuf

类似我们传统使用的json,xml等传输数据的方式。

google 提供了三种语言的实现:java、c++
python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用
xml 进行数据交换快许多。

二、Protobuf的优点

1,性能好,效率高,较之json或xml传输速度快,因为它是二进制的,相对应的缺点就是可读性不高

2,代码生成机制,数据解析类自动生成

3,支持向后兼容和向前兼容

4,支持多种编程语言(java,c++,python)

三、简单的将protobuf与xml进行对比一下:

ProtocolBuffer拥有多项比XML更高级的串行化结构数据的特性,ProtocolBuffer:

更简单
小3-10倍
快20-100倍
更少的歧义
可以方便的生成数据存取类

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

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

[/code]
对应的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 文件时才有意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: