上一篇结尾的时候问了几个问题,其实主要就是这个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. Jmeter之Bean shell使用(二)

    上一篇Jmeter之Bean shell使用(一)简单介绍了下Jmeter中的Bean shell,本文是对上文的一个补充,主要总结下常用的几种场景和方法,相信这些基本可以涵盖大部分的需求.本节内容如 ...

  2. MySQL字符集的修改和查看

    1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集 ...

  3. JQuery中的extend函数

    1.jQuery.fn.extend(object) 扩展 jQuery 元素集来提供新的方法(通常用来制作插件). 例如:增加两个插件方法. jQuery.fn.extend({ check: fu ...

  4. 网络基本概念备忘:MAC地址,端口,HTTP状态码

    MAC地址 英文MAC Address 英文全称: Media Access Control Address 别称:硬件位址 用途:定义网络设备位置 表示:十六进制数,6 Byte 特点:产品出产后M ...

  5. poj 2104 K-th Number(可持久线段树)

    K-th Number 持久化:http://www.cnblogs.com/tedzhao/archive/2008/11/12/1332112.html 结构:http://www.docin.c ...

  6. django用户登录和注销

    django版本:1.4.21. 一.准备工作 1.新建项目和app [root@yl-web-test srv]# django-admin.py startproject lxysite [roo ...

  7. [转]backbone.js 初探

    本文转自:http://weakfi.iteye.com/blog/1391990 什么是backbone backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架. 主要提供了 ...

  8. plain framework 1 参考手册 入门指引之简介

    简介 简介 能做什么? LINUX WINDOWS 简介 简约框架(plain framework)是一款基于C/C++开发的,跨平台(windows/linux)应用的基础框架,开发者可以利用此框架 ...

  9. Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。

    这几天做一个小的聊天项目用到对象序列化的知识,发现对象序列化不能像普通文件一样直接追加对象.每次写入对象都会被覆盖.弄了2个多小时终于解决了.Java默认的对象序列化是每次写入对象都会写入一点头ace ...

  10. C#中Abstract和Virtual

    C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...