16年3月写的一篇文章,迁移到csdn上面来。
----------------------------
最近在做数据传输的相关内容时接触到了PB,发现这个技术已经在互联网领域大规模使用了,做了个小小专题,
第一步:看官网
官网地址:
https://developers.google.com/protocol-buffers/?hl=zh-CN
PS.官网主要是英文的
什么是PB?
ProtoBuf(protocol buffers、PB)是一款开源项目,是google提供的一种将结构化数据进行序列化和反序列化的方法(数据变成二进制的)。大约在2008年的时候,谷歌把ProtoBuf贡献给了开源社区,在随后不到1年的时间里,该款产品的用户使用量猛增。类似的概念有xml、json。国内淘宝、微信等都大规模使用PB,产生大量经典案例。
为什么要用PB?
PB的优点:语言中立,平台中立,可扩展性好。重要的是与xml相比:smaller, faster, and simpler!
xml一直以性能不足,功能冗余而出名。对于一些PB级别的海量业务而言,使用xml无意是非常不情愿的状态,这也就是google弃用XMl转而制造出PB的原因。
像 Java, Python, and C++等语言都是可以使用的。用户只要按照proto语法在.proto文件中定义好数据的结构,就可以使用PB提供的工具(protoc)自动生成处理数据的代码,使用这些代码就能在程序中方便的通过各种数据流读写数据。
.proto数据结构
官网给出了三种数据结构形式
形式1:
-
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
形式2:
-
Person john = Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("[email protected]")
.build();
output = new FileOutputStream(args[0]);
john.writeTo(output);
形式3:
-
Person john;
fstream input(argv[1],
ios::in | ios::binary);
john.ParseFromIstream(&input);
id = john.id();
name = john.name();
email = john.email();
由数据结构来看,可以发现PB还有一下优点:
1.向后兼容性更好。在依靠老数据结构程序的基础上,对数据结构进行升级时,在添加新消息里的field并不会引起已发布程序的任何改变。
2.语义更清楚
3.无需学习复杂的文档对象模型,编程模式更加友好
后续:
PB的python实践
PB与xml、json的深度比较
动态消息下的PB
PB适合的领域
参考资料:
http://www.searchtb.com/2012/09/protocol-buffers.html
https://developers.google.com/protocol-buffers/docs/pythontutorial?hl=zh-CN#parsing-and-serialization