Google protobuf(1)-简介

一、简介。

protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式,等等。其特点是不限语言、不限平台、扩展性强,就像XML一样。与XML相比,protobuf有以下特点:

1、操作更简单。

例如,我们要定义一个个人信息的结构,其中包括名称和邮箱地址两个部分。

用XML定义如下:

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

使用C++,访问方式可能如下:

cout << person.getTag("name").getText() << endl;

cout << person.getTag("email").getText() << endl;

如果用protobuf,则定义如下

message person {

   optional string name;

   optional string email;

}

如果使用C++,访问方式可能如下:

cout << person.getName() << endl;

cout << person.getEmail() << endl;

 

访问方式更简单。

 

2、序列化后生成的代码体积更小

还是上述消息,使用protobuf进行编码后,体积大约是28个字节;而如果使用XML进行编码,则大约需要69个字节(除去空格)。

 

3、解析速度更快。

对上述编码后的数据进行解析,protobuf需要100-200纳秒;而XML则需要5000-10000纳秒。

 

4、与XML相比,protobuf的缺点是不易读。众所周知,XML是一种自描述语言,一看就可知道其作用,见文知意。而protobuf序列化后是一串二进制代码,如果没有对应的协议格式(即.proto文件),想要读懂它难如登天。另外,如果目标是一种基于文版的标签式文档(如html),则XML更具优势。

 

关于protobuf的历史及其特点,可参考Google网站:点击打开链接

 

二、语法规则

protobuf协议的文件后缀名为.proto。一个简单的protobuf协议如下:

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;

}

 

message AddressBook {

  repeated Person person = 1;

}

 

1、标识符

protobuf协议的标识符为message或enum,如示例中的Person和PhoneType。message标识一条消息,enum标识一个枚举类型。使用protobuf编译器将协议文件编译后,message和enum都会生成一个类。

 

2、字段

协议字段格式如下:

role type name = tag [default value];

role有三种取值:

required:表示该字段必须有值,不能为空,否则message被认为是未初始化的。如果试图build一个未初始化的message将会抛出RuntimeException。解析未初始化的message会抛出IOException。

 

optional:表示该段为可选值,可以不进行设置。如果不设置,会设置一个默认值。可以设置一个默认值,正如示例中的type字段。否则使用系统默认值,数字类型默认为0;字符串类型默认为空字符串;逻辑类型默认为false;内部自定义的message,默认值通常是message的实例或原型。

 

repeated:表示该字段可以重复,可等同于动态数组。

 

注意:使用required字段一定要小心,因为该字段是永久性的。如果以后因为某种原因,想不用该字段,或者要将该字段改成optional或者repeated,那么使用旧接口读取新的协议时,如果发现没有该字段,他们会认为该字段是不完整的,会拒接接收该消息,或者直接丢弃。

 

3、字段类型

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值