一、什么是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>
对应的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 文件时才有意义。