一、简单的介绍



     Protocol buffers是一个用来序列化结构化数据的技术,支持多种语言诸如C++、Java以及Python语言。能够使用该技术来持久化数据或者序列化成网络传输的数据。相比較一些其它的XML技术而言。该技术的一个明显特点就是更加节省空间(以二进制流存储)、速度更快以及更加灵活。

通常,编写一个protocol buffers应用须要经历例如以下三步:

1、定义消息格式文件。最好以proto作为后缀名



     2、使用Google提供的protocol buffers编译器来生成代码文件,一般为.h和.cc文件,主要是对消息格式以特定的语言方式描写叙述



     3、使用protocol buffers库提供的API来编写应用程序  



     二、定义Proto文件 



     proto文件即消息协议原型定义文件,在该文件里我们能够通过使用描写叙述性语言,来良好的定义我们程序中须要用到数据格式。

首先我们能够通过Google在线文档上提供的一个电话簿的样例来了解下。只是略微加了点修改。     



message Person {

  required string name = 1;

  required int32 id = 2;

  optional string email = 3;



  enum PhoneType {

    MOBILE = 0;

    HOME = 1;

    WORK = 2;

  }





  message PhoneNumber {

    required string number = 1;

    optional PhoneType type = 2 [default = HOME];

  }



  repeated PhoneNumber phone = 4;

  

  required bytes  unsure = 5;      //Add byte array here    

}



message AddressBook {

  repeated Person person = 1;

}



     诚如你看到的一样,消息格式定义非常easy。对于每一个字段而言都有一个修饰符(required/repeated/optional)、字段类型(bool/string/bytes/int32等)和字段标签(Tag)组成。



     三个修饰符从词义上能够非常清楚的弄明确。



    1)对于required的字段而言,初值是必需要提供的,否则字段的便是未初始化的。

在Debug模式的buffer库下编译的话,序列化话的时候可能会失败,并且在反序列化的时候对于该字段的解析会总是失败的。所以,对于修饰符为required的字段,请在序列化的时候务必给予初始化。

2)对于optional的字段而言,假设未进行初始化。那么一个默认值将赋予该字段。当然也能够指定默认值。如上述proto定义中的PhoneType字段类型。



    3)对于repeated的字段而言,该字段能够反复多个,google提供的这个addressbook样例便有个非常好的该修饰符的应用场景,即每一个人可能有多个电话号码。在高级语言里面,我们能够通过数组来实现,而在proto定义文件里能够使用repeated来修饰,从而达到同样目的。当然。出现0次也是包括在内的。

当中字段标签标示了字段在二进制流中存放的位置,这个是必须的,并且序列化与反序列化的时候同样的字段的Tag值必须相应,否则反序列化会出现意想不到的问题。

三、编译proto文件。生成特定语言数据的数据定义代码

在定义好了proto文件。就能够将该文件作为protocol buffers编译器的输入文件。编译产生特定语言的数据定义代码文件了。本文主要是针对C++语言,所以使用编译器后生成的是.h与.cc的代码文件。对于C++、Java还有Python都有各自的编译器。下载地址:http://code.google.com/p/protobuf/downloads/list  



     当你下载完了相应的编译器二进制文件后。就能够使用下列命令来完毕编译过程:



     protoc.exe -proto_path=SRC --cpp_out=DST SRC/addressbook.proto 



     当中--proto_path指出proto文件所在的文件夹,--cpp_out则是生成的代码文件要放的文件夹,最后的一个參数指出proto文件的路径。如上述命令中能够看出,将SRC文件夹下的addressbook.proto编译后放在DST文件夹下。应该会生成addressbook.pb.h和addressbook.pb.cc文件(/Files/royenhome/addressbook.rar)。

通过查看头文件,能够发现针对每一个字段都会大致生成例如以下几种函数,以number为例:



  // required string number = 1;

  inline bool has_number() const;

  inline void clear_number();

  inline const ::std::string& number() const;

  inline void set_number(const ::std::string& value);

  inline void set_number(const char* value);

  inline ::std::string* mutable_number();



      能够看出。对于每一个字段会生成一个has函数(has_number)、clear清除函数(clear_number)、set函数(set_number)、get函数(number和mutable_number)。这儿解释下get函数中的两个函数的差别,对于原型为const std::string &number() const的get函数而言,返回的是常量字段,不能对其值进行改动。可是在有一些情况下,对字段进行改动是必要的。所以提供了一个mutable版的get函数,通过获取字段变量的指针,从而达到改变其值的目的。



      而对于字段修饰符为repeated的字段生成的函数。则略微有一些不同,如phone字段,则编译器会为其产生例如以下的代码: 



  // repeated .Person.PhoneNumber phone = 4;

  inline int phone_size() const;

  inline void clear_phone();

  inline const ::google::protobuf::RepeatedPtrField< ::Person_PhoneNumber >& phone() const;

  inline ::google::protobuf::RepeatedPtrField< ::Person_PhoneNumber >* mutable_phone();

  inline const ::Person_PhoneNumber& phone(int index) const;

  inline ::Person_PhoneNumber* mutable_phone(int index);

  inline ::Person_PhoneNumber* add_phone();





      能够看出,set函数变成了add函数,这个事实上非常好理解。

上面也说过。repeated修饰的字段在高级语言中的实现可能是个数组或动态数组,所以当然通过加入的方式来加入新的字段值。而起get函数也变化非常大。这个也不用多说了。

好了。本文主要是对了解protocol buffer作了些简单的介绍,当然更具体的还是看官方文档。

google protocol buffer的原理和使用(一)的更多相关文章

  1. google protocol buffer的原理和使用(二)

    本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法非常多种,本文仅仅介绍当中的三种.其它的方法读者能够通过自行研究摸索.但总的来说,序列化数据总的来说分为下面俩步: ...

  2. google protocol buffer的原理和使用(三)

    介绍下怎么反序列化GoogleBuffer数据.并在最后提供本系列文章中所用到的代码整理供下载. 上一篇文章介绍了如何将数据序列化到了addressbook.data中.那么对于接受方而言该怎么解析出 ...

  3. google protocol buffer的原理和使用(四)

    有个电子商务的系统(如果用C++实现).当中的模块A须要发送大量的订单信息给模块B.通讯的方式使用socket. 如果订单包含例如以下属性: ----------------------------- ...

  4. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  5. 转Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  6. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  7. Google Protocol Buffer 的使用和原理(无论对存储还是数据交换,都是个挺有用的东西,有9张图做说明,十分清楚)

    感觉Google Protocol Buffer无论对存储还是数据交换,都是个挺有用的东西,这里记录下,以后应该用得着.下文转自: http://www.ibm.com/developerworks/ ...

  8. (转)Google Protocol Buffer 的使用和原理

    转自:https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html   简介 什么是 Google Protocol Buffer? ...

  9. Google Protocol Buffer 协议

    1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...

随机推荐

  1. PAT Basic 1017

    1017 A除以B(20 分) 本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: 输入在一 ...

  2. 在oracle中怎么通过字段名查询其所在的表

    ora = //连接描述符名:ora (description = //描述 (address = //网络地址之一 (protocol = tcp) //网络协议(tcp表示TCP/IP协议) (h ...

  3. pycharm调整字体大小

    问题:pycharm的默认字体比较小,看起来费眼睛 解决办法: 1.打开 file-->settings 2.Editor-->font 注意:没有修改过的需求先保存一下才能修改size

  4. php官方微信接口大全

    微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class ...

  5. PHP 获取文件名和扩展名的方法

    dirname(path) path: 代表你的文件路径,必须为绝对路径,可以使用__FILE__, 表示列出当前文件的绝对路径,包含文件名 函数会返回当前文件的上一级路径,也就是除了文件名称的路径 ...

  6. hdu2024

    这题目感觉不是很严谨,如果是关键字的话也是不能作为合法标识符的,但是这个不用检测,就算要检测也会很费劲,还得用字符串匹配,而且还得知道一共都有哪些关键字,太麻烦了,所以出题人原意就是检查大小写字母数字 ...

  7. hdfs api读写文写件个人练习

    看下hdfs的读写原理,主要是打开FileSystem,获得InputStream or OutputStream: 那么主要用到的FileSystem类是一个实现了文件系统的抽象类,继承来自org. ...

  8. sqlite-jdbc

    sqlite-jdbc驱动下载 https://bitbucket.org/xerial/sqlite-jdbc/downloads import java.sql.*; public class T ...

  9. jQuary的相关动画效果

    第一种:该方法隐藏所有 <p> 元素: <html> <head> <script type="text/javascript" src= ...

  10. Linux命令——top

    top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具.通过top命令所提供的互动式界面,用热键可以管理. 语法 top(选项) 选项 -b:以批处理模式 ...