【一】Protocol Buffers的简单介绍

2016-3-12 pierre

最近在做数据传输的相关内容时接触到了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:

  1. message Person {
  2. required string name = 1;
  3. required int32 id = 2;
  4. optional string email = 3;
  5. }

形式2:

  1. Person john = Person.newBuilder()
  2. .setId(1234)
  3. .setName("John Doe")
  4. .setEmail("jdoe@example.com")
  5. .build();
  6. output = new FileOutputStream(args[0]);
  7. john.writeTo(output);

形式3:

  1. Person john;
  2. fstream input(argv[1],
  3. ios::in | ios::binary);
  4. john.ParseFromIstream(&input);
  5. id = john.id();
  6. name = john.name();
  7. 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



来自为知笔记(Wiz)


发表评论:

Powered by emlog 陕ICP备15016021 sitemap