学习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? ...
随机推荐
- proxool 连接池警告分析:appears to have started a thread named [HouseKeeper] but has failed to stop it
1. 问题:日志中出现下面的警告: 警告: The web application [ROOT] appears to have started a thread named [HouseKeeper ...
- 理解linux and inode
inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念 ...
- 网络基本概念备忘:MAC地址,端口,HTTP状态码
MAC地址 英文MAC Address 英文全称: Media Access Control Address 别称:硬件位址 用途:定义网络设备位置 表示:十六进制数,6 Byte 特点:产品出产后M ...
- linux GD库安装
GD 安裝第一部需要做的是先要安裝 GD 到系統內,而安裝 GD 前需要安裝 jpeg-6b, libpng, zlib, freetype.以下是下载网址:GD 2.0.33jpeg-6blibpn ...
- sshpass批量执行操作
while read line do ./sshpass -p 密码 ssh root@$line “ls” done<./backup while read line ;do /usr/bin ...
- (二)cordova+framework7入门——笑笑APP
[前言] framework7确实做的很赞,但是一直各种原因没有做什么app, 这个感觉就像大厨遇到百年难见的好材料,不炒个菜憋的慌, 机缘巧合周一周二两个晚上做了一个简单app,先看下效果: ios ...
- [No000060]冷读热读:读书九问
兵无常势,水无常形,读书亦无法.彼之砒霜,我之佳肴.然读书无法却有道.你我都是使用同一颗大脑在读书.这颗大脑受制于那千千万万年以来,星辰起落,狩猎采集,演化大道. Q1:读物如何分级? 坏书.可用的书 ...
- Android中一张图片加载后所占用内存大小的获取与测试
Android程序中一旦加载的图片比较多,就有可能出现Out of Memory而导致程序崩溃.这个一方面是因为Android系统本身对于每个单独的进程有内存大小的限制(有16M,64M,128M,2 ...
- jq分页异步刷新 ,全局刷新问题
在做分页的时候,可能点击下一页全部刷新 这样写会导致动态刷新,页面全部刷新了 $("#pageList a").click(function () { var $s = $(thi ...
- 集合中Set接口与Collection接口,常用子类TreeSet,HashSet.
Set接口与List接口的不同之处在于: 不允许有重复的数据. 定义如下: public interface Set<E>extends Collection<E> 主要方法与 ...