定义 Message 类型, 例子如下:

syntax = "proto3";

message SearchRequest {
string query = 1;
int32 page_number = 2; // Which page number do we want?
int32 result_per_page = 3; // Number of results to return per page.
}
说明:

1、proto3 格式的必须第一行指明版本号,  syntax = "proto3";

2、所有的字段都是 Scalar Value Types

3、象上面看到的,所有的字段定义都有一个唯一的数字标签,这些数字标签用来标识在消息二进制序列化时的顺序信息,序列化后,1~15占一个字节,16~2047占两个字节。(字段的类型和识别号码放在一起,下面可以看到 Scalar Value Types有15种,再加上标识号码, 所以只能 1-15 占一个字节, 16以上2个字节)
所以你要注意,用1-15标识频繁出现的元素。 标识号码最小 1, 最大  is 229 - 1, 或者 536,870,911, 其中要排除 19000 到19999 这段保留段。

Scalar Value Types

在 proto 文件和各种语言中对应的类型关系如下图:

这些类型的默认值如下:

  • string  空字符串
  • bytes 空 bytes
  • bool 默认flase
  • 数字类型 默认 0
  • 枚举类型 默认第一个值, 而且第一个的数字编码必须是 0
  • message fields 默认 null
  • repeated  的字段默认是 null, 空的列表。

带枚举的一个message 例子:

message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
enum Corpus {
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
LOCAL = 3;
NEWS = 4;
PRODUCTS = 5;
VIDEO = 6;
}
Corpus corpus = 4;
}

对枚举来说, 如果设置了 option allow_alias = true;  就可以让枚举项的值一样,相当于起了别名。

enum EnumAllowingAlias {
option allow_alias = true;
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1;
}

定义引用

Message 可以使用其他 Message作为字段,即嵌套定义,比如下面定义:

message SearchResponse {
repeated Result result = 1;
} message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}

这里的  repeated  关键字相当于定义了一个对应的数组,数组元素是其后的类型, 数组的大小可以是0到很大, 由于历史原因,数值型的repeated字段后面最好加上[packed=true],这样能达到更好的编码效果。

互相引用

如果 proto 文件定义不在这个文件, 我们可以通过下面方式引入:

import "myproject/other_protos.proto";

对于跨多个文件的引用, 这时候我们会用到 public 关键字, 它的用法如下:

// new.proto  文件
// All definitions are moved here
// old.proto 文件
// This is the proto that all clients are importing.
import public "new.proto";
import "other.proto";
// client.proto 文件
import "old.proto";
// You use definitions from old.proto and new.proto, but not other.proto

public 的定义会一直嵌套带入 import。

内部Message, 嵌套定义

你可以在 message 内部定义 message,如下面代码:

message SearchResponse {
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
repeated Result result = 1;
}

需要使用这个内部 message时,可以这么使用:

message SomeOtherMessage {
SearchResponse.Result result = 1;
}

由于有这个命名空间层级关系, 你可以这么定义:

message Outer {                  // Level 0
message MiddleAA { // Level 1
message Inner { // Level 2
int64 ival = 1;
bool booly = 2;
}
}
message MiddleBB { // Level 1
message Inner { // Level 2
int32 ival = 1;
bool booly = 2;
}
}
}

最里面的两个 message 的字段名称一样,只是字段类型不一样。

参考资料:

Language Guide (proto3)
https://developers.google.com/protocol-buffers/docs/proto3?hl=zh-cn

proto3 笔记1的更多相关文章

  1. 转: Protobuf 的 proto3 与 proto2 的区别

    Protobuf 的 proto3 与 proto2 的区别   On 2015-07-17 19:16:00 By Soli   Protobuf 的 proto3 与 proto2 的区别 这是一 ...

  2. Protobuf 语言指南(proto3)

    Protobuf 语言指南(proto3) Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数 ...

  3. gPRC学习笔记

    gPRC学习笔记 gPRC基础教程. gPRC官方文档. protobuf 3.0的简易教程. 什么是RPC RPC(remote procedure call) -- 远程过程调用(相对于本地调用的 ...

  4. go笔记--rpc和grpc使用

    目录 go笔记--rpc和grpc使用 rpc server.go client.go (sync) client.go (async) grpc protoc server.go client.go ...

  5. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

随机推荐

  1. Qt使用gtest进行C++单元测试-01

    环境: win7/win10+qt5.8.0(MinGW), 1.gtest获取: 从:https://www.bogotobogo.com/cplusplus/google_unit_test_gt ...

  2. Xcode的多种Build Configuration

    一: 建多个Configuration的目的. 多套域名打包. 1 开发时的域名. 2 内测时的域名. 3 公测时的域名. 4 企业版的域名. 5 APP Store的域名. 通过注释的方式,容易出错 ...

  3. django 使用celery 实现异步任务

    celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...

  4. Linux core 文件 gdb

    http://blog.csdn.net/mr_chenping/article/details/13767609 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时 ...

  5. poj1125

    题目大意:哎,意思看了半天,看了别人的解释才明白,就是说从一个经纪人出发传递消息,直到所有人都收到消息 也就是说只要找到该经纪人到其它所有点的最短距离中的最大一个时间,就说明最后一个也收到消息了. 而 ...

  6. PHP开发接口,封装方法

    接口的主要功能是从服务器端获取数据,然后渲染到客户端 其主要的实现流程一般会经历这样的几个阶段服务器端----> 数据库|缓存 ----> 调用接口 ---->客户端 在接口数据传输 ...

  7. linux文件的硬连接和软连接

    建立软连接:ln -s 原路径 目标路径 原理示意图: 特点: 1.     相当于win中的快捷方式 2.     删除链接文件,源文件不受影响 3.     删除源文件,链接文件失效 4.     ...

  8. 通过sessionStorage来根据屏幕宽度变化来加载不同的html页面

    因为项目需要,分别写了移动端和PC端的两个html页面,现在需要根据不同的屏幕宽度来加载对应的页面. 先说一下本人的思路-- 刚开始我直接在加载页面的时候判断屏幕宽度,然后加载相应的页面,大家是不是也 ...

  9. html5聊天案例|趣聊h5|仿微信界面聊天|红包|语音聊天|地图

    之前有开发过一个h5微直播项目,当时里面也用到过聊天模块部分,今天就在之前聊天部分的基础上重新抽离模块,开发了这个h5趣聊项目,功能效果比较类似微信聊天界面.采用html5+css3+Zepto+sw ...

  10. (01)JVM-内存三大核心区域以及分析

    package org.burning.sport.jvm; /** *  从JVM调用的角度分析Java程序对内存空间的使用, * 当JVM进程启动的时候,会从类加载器路径中找到包含main方法的入 ...