protobuf 语法简介

1.基本语义

在.proto文件中,最基本的数据类型为message,如其定义所示,由message引导,之后是message类型的名字,之后是由{}包含的各个域(fields)。

required string name = 1; 域字义的一个例子。

required 表示这个域是必需的

optional 该域选,出现0次或1次

repeated 重复出现,0次或多次

string是域的类型,可是简单的标量类型(如bool,int32,float,double,string等),也可是复合类型(message,enum等)

name是域的名字,=1是给域一个数字标签,这会影响到该域在二进制文件中顺序。

关于这个数字标签也是有说明的,1到15是只使用一个字节编号,而其他的使用多个字节,所以应把1-15编号给最经常使用的域。数字标签的最大值为2^29 - 1(或536,870,911),其中还有一段是保留用于proto的实现,从19000到19999(FieldDescriptor::kFirstReservedNumber到FieldDescriptor::kLastReservedNumber)。

有optional说明的域可以有一个默认值,在不指定该域时使用,如optional PhoneType type = 2 [default = HOME];

还有一种类型是enum,如上enum PhoneType的定义。类型可以定义在一个message类型中,也可以单独定义,如上enum PhoneType和message PhoneNumber是嵌套定义在message Person中,message AddressBook中单独定义的。

可以访问一个嵌套定义在另一个message类型中的message,但需使用域范围标示,如同的c++里使用另一个命名空间的类:person::PhoneNumber。

添加注释://

optional int32 page_number = 2;// Which page number do we want?

2.导入

导入:proto可以导入在不同的文件中的定义。通过在文件顶端加入一个import语句

import "myproject/other_protos.proto";

3.扩展

扩展:proto支持将一定范围内的数字编号作为扩展时使用。

message Foo {

// ...

extensions 100 to 199;

}

extend Foo {

optional int32 bar = 126;

}

4.包

proto支持包的使用,以防止命名冲突。在文件的开始部分指定:package tutorial。不同的语言在生成代码对包的处理是不同的:c++中作为命名空间,java中也作包,python中是模块。

options:可使用option来指定一些选项,会对生成的代码有一些影响。option分文件层的和域层的。在上面的例子中就使用了文件层的:

option java_package = "com.example.tutorial";

option java_outer_classname = "AddressBookProtos";

5.生成代码:使用protoc编译器就可以生成相应语言的代码。

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/file.proto

protoc.exe是编译器的名字;--proto_path指定对导入文件的搜索路径,若不指定,则为当前路径;--cpp_out指定生成c++文件的路径,--java_out和 --python_out分别是生成java和python代码的路径;path/file.proto是定义结构的.proto文件。

使用c++语言,会生成针对每个message类型的一个类,对每一个类也提供了相应的处理方法,还提供了序列化到输出流和从输入流中解析的方法。

原文

http://blog.itpub.net/post/42700/527047

http://www.cnblogs.com/mydomain/p/3176373.html

protobuf 语法简介的更多相关文章

  1. protobuf语法简介2

    protobuf语法简介2 1.optional的字段和默认值 如上所述,消息描述中的一个元素可以被标记为"可选的"(optional).一个格式良好的消息可以包含0个或一个opt ...

  2. freemarker语法简介

    ftl是一种模板标记语言,用于渲染数据,输入html结构.语法简介如下: ${book.name} ${book.name?if_exists} //值是否存在 ${book.name??} //值是 ...

  3. Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)

    目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本 ...

  4. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  5. Protobuf 语法 - 史上最简教程

    Protobuf 语法简明教程 疯狂创客圈 死磕Netty 亿级流量架构系列之12 [博客园 总入口 ] 在protobuf中,协议是由一系列的消息组成的.因此最重要的就是定义通信时使用到的消息格式. ...

  6. ES6常用语法简介import export

    ES6常用语法简介import export let与var用法区别 //var var a = []; for (var i = 0; i < 10; i++) { a[i] = functi ...

  7. Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465603       Android系统Recovery工作原理之使用update.zip ...

  8. 【ABAP系列】SAP ABAP7.40新语法简介第一篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

  9. 【ABAP系列】SAP ABAP7.40新语法简介第二篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

随机推荐

  1. 紧急救援 L2-001 dijkstra 打印路径 最短路条数 权值

    较为复杂的dijkstra 包含路径打印  最小路的条数  最小路径的情况下取最大权值 v0要是标记就会出错...? 有权值的题目  不能设置mp[i][i]为0  否则会无限加权 这题很有参考价值 ...

  2. Card Game Cheater HDU1528

    二分图最大匹配问题 扑克题还是用map比较方便 #include<bits/stdc++.h> using namespace std; #define MAXI 52 ]; ]; int ...

  3. Java反射1——扫描某个包下的所有类

    1.从包package中获取所有的Class /** * 从包package中获取所有的Class * * @param pack * @return */ public static Set< ...

  4. WIN10下 VS2017+OpenCv 3.4.1 配置

    写篇博客来记录一下opencv在VS中的配置. 一.下载OpenCv安装包 下载的途径有三种: 1.官网下载 但是官网下载真的是贼头大,首先下载好好的突然说下载中断,而且无法恢复,此外,还慢,毕竟外网 ...

  5. springmvc+swagger2

    一.swagger2依赖 <!--swagger--> <dependency> <groupId>io.springfox</groupId> < ...

  6. SpringMVC框架08——统一异常处理

    前言 在Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的.不可预知的异常需要处理.如果每个过程都单独处理异常,那么系统的代码耦合度高, ...

  7. 【python学习-3】python数据类型

    1.数字 在python 2.x中,数字类型有4种,int.long.float 和 complex(复数):而python 3 中,只有 int.float 和 complex 3种,python ...

  8. Android Data Binding

    Android官方数据绑定框架DataBinding, 1.什么是DataBinding 2.DataBinding基础用法 3.DataBinding原理 4.表达式 5.null检查 6.incl ...

  9. 阿里云VPC默认网关问题

    在使用VPC专用网络时,阿里云上面不用设置网关都可以工作,其实不是的,狗日的阿里云居然把默认网关设置成了253,比如设置了172.18.0.0/24时,那么它的默认网关就是172.18.0.253.

  10. python及扩展程序安装

    安装 从官方网站下载python程序,我下载的是python-3.3.2.msi 然后下载python扩展程序,我下载的是pywin32-218.win32-py3.3.exe 最后下载wmi插件,我 ...