上一篇结尾的时候问了几个问题,其实主要就是这个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_out generates C++ code in DST_DIR.
    • --java_out generates Java code in DST_DIR.
    • --python_out generates Python code in DST_DIR.

学习Google Protocol buffer之语法的更多相关文章

  1. 学习Google Protocol buffer之概述

    XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...

  2. 【神经网络与深度学习】Google Protocol Buffer介绍

    简介 什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Googl ...

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

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

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

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

  5. Google Protocol Buffer 的使用和原理

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

  6. 【Google Protocol Buffer】Google Protocol Buffer

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...

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

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

  8. Google Protocol Buffer入门

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

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

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

随机推荐

  1. MySQL 调优基础(二) Linux内存管理

    进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...

  2. 烂泥:通过binlog恢复mysql数据库

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在上一篇文章,我们讲解了有关mysql的binlog日志的基础知识.这篇文章,我们来讲解如何通过mysql的binlog日志来恢复数据库. 在使用bin ...

  3. 中科院分词ICTCLAS5.0_JNI 使用方法

    1.简介 中国科学院计算技术研究所在多年研究基础上,耗时一年研制出了基于多层隐码模型的汉语词法分析系统 ICTCLAS(Institute of Computing Technology, Chine ...

  4. MT7620a openwrt barrier_breaker编译后wan口dhcp无法获得地址

    前言 我司准备使用openwrt barrier_breaker版本做二次开发.在烧入固件后发现wan口,dhcp无法获得地址.经如下修改后,mt7620a的路由器可以正常获得地址. 修改dts文件 ...

  5. 学习OpenStack之 (3):Devstack Screen 使用技巧

    Devstack环境中,openstack运行在一个screen中,每个service运行在一个window中.我总结的几个tips: 0. 注意需要使用screen启动用户来进行一下操作 1. 查看 ...

  6. 使用Openswan接入Windows Azure Site to Site VPN

    Winodows Azure的Site to Site VPN支持主流的防火墙和路由器等接入设备.具体型号和系列请参考下表: VENDOR DEVICE FAMILY MINIMUM OS VERSI ...

  7. Addthis使用

    一.使用 https://www.addthis.com/.国外的SNS分享站点较多,适用于英文站点内容的分享.有教程. 我的测试代码如下: <html> <meta charset ...

  8. 怎样在ZBrush中快速绘制人体躯干

    之前我们对人体骨点的雕刻,了解了人体骨骼比例结构特征.今天的ZBrush教程将通过ZBrush®遮罩显示的特点对模型的人体躯干进行细致雕刻.文章内容仅以fisker老师讲述为例,您也可以按照自己的想法 ...

  9. APDU

    # APDU # 定义:APDU(ApplicationProtocolDataUnit--应用协议数据单元).协议数据单元PDU(ProtocolDataUnit)是指对等层次之间传递的数据单位.协 ...

  10. CodeForces 466E Information Graph --树形转线性+并查集

    题意:有三种操作: 1.新增一条边从y连向x,此前x没有父节点 2.x接到一份文件,(文件标号逐次递增),然后将这份文件一路上溯,让所有上溯的节点都接到这份文件 3.查询某个节点x是否接到过文件F 解 ...