学习Google Protocol buffer之语法
上一篇结尾的时候问了几个问题,其实主要就是这个protoBuffer协议的语法,弄清楚语法后边才好开展工作嘛,不然大眼而对小眼儿,互相不认识,就没法玩耍了。其实就是学习怎么用google提供的这套 protocol buffer language 来组织我用的数据,那个神奇的proto文件的来龙去脉也得搞搞清楚。
好吧,还是看个例子,也是官方的:
message SearchRequest {
required string query = ;
optional int32 page_number = ;
optional int32 result_per_page = ;
}
这片代码的意思是,定义了一个message类型SearchRequest ,所谓类型,你就要知道,这不是创建对象,而是类定义。这个SearchRequest要查询一个词,然后需要知道这个词在第多少页,还要知道那一页包括了多少个关键词。这就抽象出了三项数据,每一项数据都是一个数据域,像上面就有三个数据域。我们都写过代码,显然这三个域的类型分别是string,int32,int32,这三个数据域的变量名是query,page_number,result_per_page,然后看上去很像分别进行了赋值1,2,3。但完全不知道的是required,optional是什么意思,从字面意思上理解,也许是必须,可选的定义。
现在对上面的三个域进行解惑吧,的确每个域都一个类型,这个类型有特别的定义,是谷歌自己定义的,包括有很多:

相信程序员们都不会陌生,接触一个新的语言或者规范,很多时候都会有这样的类型定义。没什么可说的,遇到就查询这个表吧。这个表可不全,最好去查官方的,我这就是个例子。然后看看那个像赋值语句的右半部分意思,其实那个google的独有定义,叫做unique numbered tag,是个域的唯一标记,说明我这个域是的标记是几,这么做也许是为了方便索引,只是看起来有点奇怪。这个Tag的用法还是很讲究的,1到15会用到第一个字节,16到2047会用两个字节,我觉得大部分的应用应该两个字节就够了,要是超2047说明出问题了。官方提到了说你要把最常用的排进这1到15区间,也许第一个字节访问起来会很快?
再看看这个required,optional这些修饰词。先看看官方说明吧:
required: a well-formed message must have exactly one of this field.(一个完整的message,必须要至少有一个这样的域)optional: a well-formed message can have zero or one of this field (but not more than one).(至多有1个这样的域)repeated: this field can be repeated any number of times (including zero) in a well-formed message. The order of the repeated values will be preserved.(这个域可重复任意次,包括0次)
这个修饰词基本就定义了protobuffer的灵活性,也就是说你的一个字段可以有,可以无,也可以有很多。但是,required是弊大于利,谷歌官方不推荐使用,因为会造成不兼容的问题,这和protobuffer的设计理念就冲突了,它也不能替你保证逻辑的正确性。这个optional,可以设置默认值,因为是可有可无,所以你可以指定默认值,也可以不指定,如果没有指定的话,在解析出该项后,将会用语言相关的默认值,例如Int ,那就是0了。注意下面语句中默认值的设置位置和分号的位置
optional int32 result_per_page = [default = ];
基本的语法也就这些了,碰上不懂的就去查百度吧。
写完Proto文件后,接下来做什么呢?按照官方说法,需要用protoc.exe这个工具来生成编程语言(例如,C++/Java/Python)用的文件,这个exe的主要作用就是读取proto文件,然后用命令行来驱动:
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/to/file.proto
IMPORT_PATH指定你编写好的Proto文件路径,不是单独文件的路径,而是文件夹的路径,如果没有配置的话就是当前路径,可以指定多个路径。可以考虑长远一点,这个路径可以从配置文件中读取.- 关于输出路径,不同的语言可以输出到不同的路径下去
--cpp_outgenerates C++ code inDST_DIR.--java_outgenerates Java code inDST_DIR.--python_outgenerates Python code inDST_DIR.
输出路径的指定:
学习Google Protocol buffer之语法的更多相关文章
- 学习Google Protocol buffer之概述
XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...
- 【神经网络与深度学习】Google Protocol Buffer介绍
简介 什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Googl ...
- Google Protocol Buffer 的使用和原理[转]
本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...
- Google Protocol Buffer 的使用和原理(无论对存储还是数据交换,都是个挺有用的东西,有9张图做说明,十分清楚)
感觉Google Protocol Buffer无论对存储还是数据交换,都是个挺有用的东西,这里记录下,以后应该用得着.下文转自: http://www.ibm.com/developerworks/ ...
- Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- 【Google Protocol Buffer】Google Protocol Buffer
http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...
- 转Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- Google Protocol Buffer入门
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- (转)Google Protocol Buffer 的使用和原理
转自:https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html 简介 什么是 Google Protocol Buffer? ...
随机推荐
- 将表里的数据批量生成INSERT语句的存储过程 继续增强版
文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...
- windows环境下无法引用全局安装的模块问题
问题 在node项目中,往往需要安装一些依赖的包,通常我们采取全局安装的方式,来减少一些包重复安装带来的烦恼. 但是全局安装后出现无法使用的情况,可能是你NODE_PATH没有设置或者不正确造成的. ...
- 深入理解JVM—JVM内存模型
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...
- subversion 1.8.5好像不是很成熟
加:--enable-all-static1. 没找到libneon库支持,不得不用libserf。2. libserf编译要用到scons.py,所有要有python工具支持。3. 当遇到链接少ss ...
- Server Tomcat v7.0 Server at localhost failed to start.临时解决办法
错误名:Server Tomcat v7.0 Server at localhost failed to start. 解决办法:去掉下面这句话: (通常在代码开头部分,public class前) ...
- Oracle Dataguard的原理与基本配置
最近集团在做灾备方案,用于Oracle的高可用性,在不影响主库性能的前提下,我们选择使用DG的"最大性能"模式. DG是Oracle数据库自带的数据同步功能,其基本原理是将日志 ...
- 说说React
一个组件,有自己的结构,有自己的逻辑,有自己的样式,会依赖一些资源,会依赖某些其他组件.比如日常写一个组件,比较常规的方式: 通过前端模板引擎定义结构 JS文件中写自己的逻辑 CSS中写组件的样式 通 ...
- [麦先生]TP3.2之微信开发那点事[基础篇](微信支付完成)
两种模式:扫码支付和微信内支付(调用js-sdk) trade_type==native即扫码支付,只需要将code_url转成二维码,使用微信扫码即可: js-sdk微信内支付-调用微信js-sdk ...
- Pairs Forming LCM(素因子分解)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/B 全题在文末. 题意:在a,b中(a,b<=n) ...
- Integer & int & == & equals
int 是基本类型,直接存数值,integer是对象,用一个引用指向这个对象 int 是基本数据类型,Integer是类 int类的变量初始为0,Integer的变量则初始化为null. 如果只是用来 ...