Protobuf之proto基础语法
1、说明
示例中的proto文件描述了一个数据结构,遵循 Protobuf 语法
示例:
message TestOne {
required string name = 1;
optional int32 age = 2;
}
2、字段类型
| type | C++ type | Java Type | Python Type | description |
|---|---|---|---|---|
| double | double | double | float | |
| float | float | float | float | |
| int32 | int | int | int | |
| uint32 | uint32 | int | int/long | |
| int64 | int64 | long | int/long | |
| uint64 | uint64 | long | int/long | |
| sint32 | int32 | int | int | 存数据时引入zigzag编码 (Zigzag(n) = (n << 1) ^ (n >> 31) 解决负数太占空间的问题 正负数最多占用5个字节,内存高效 |
| sint64 | int64 | long | int/long | |
| fixed32 | uint32 | int | int/long | 4 byte 抛弃了可变长存储策略 适用与存储数值较大数据 |
| fixed64 | uint64 | long | int/long | |
| sfixed32 | int32 | int | int | |
| sfixed64 | int64 | long | int/long | |
| bool | bool | boolean | bool | |
| string | string | String | unicode | |
| bytes | string | ByteString | bytes |
- 负数使用 sint ;
- 数值较大,使用 fixed ;
3、字段规则
示例中的 required 和 optional 都是字段规则,规则有以下几个:
| 字段规则 | 说明 |
|---|---|
| required | 格式良好的 message 必须包含该字段一次 |
| optional | 格式良好的 message 可以包含该字段零次或一次(不超过一次) |
| repeated | 该字段可以在格式良好的消息中重复任意多次(包括零) 其中重复值的顺序会被保留。 |
optional 字段是可选字段,如果不设定数据,则需要有一个默认值以避免出错,指定方式:
message TestOne {
required string name = 1;
optional int32 age = 2 [default = 100];
}
4、字段编号
如示例中,每个字段都有一个编号,这些编号是 唯一的。
编号1-15会占用一个字节,16-2047占用两个字节,因此尽可能使用1-15;
字段编号在 message 被使用后,就不能再更改;
5、注释
支持使用 C/C++ 风格的注释
6、类型
6.1、message
- message 表示一个类型,后面的名称将会是类名;
- 一个proto文件可以定义多种 message 类型,但尽可能减少一个proto多类型的情况;
组合 messages 会导致膨胀虽然可以在单个 .proto 文件中定义多种 messages 类型(例如 message,enum 和 service),但是当在单个文件中定义了大量具有不同依赖关系的 messages 时,它也会导致依赖性膨胀。建议每个 .proto 文件包含尽可能少的 message 类型。
6.2、service
一般在和RPC系统一起使用,示例:
service TestService {
rpc Test (TestRequest) returns (TestResponse);
}
7、枚举enum
枚举定在 message 内部
示例:
message TestOne {
required string name = 1;
optional int32 age = 2 [default = 100];
enum Country {
China = 0;
USA = 1;
}
optional Country country = 3 [default = China]
}
8、保留字段
示例:
下面例子,字段编号2/15/9/11曾经使用过,保留;字段名 foo/bar 曾经使用过,保留
message Foo {
reserved 2, 15, 9 to 11;
reserved "foo", "bar";
}
如果一个字段不再需要,如果删除或者注释掉,则其他人在修改时会再次使用这些字段编号,那么旧的引用程序就可能出现一些错误,所以使用保留字段,保留已弃用的字段编号或字段名 ,可解决该问题
9、import
如果一个 proto 文件需要使用另一个 proto 文件中的定义(message/service),就需要使用 import 引入其他的 proto 文件
import 使用 public 属性,控制依赖是否可以传递,被 public 修饰的可以传递
示例:
//second.proto
import "message/aaa.proto";
import public "message/bbb.proto";
//test_one.proto
import "message/second.proto";
message TestOne {
required string name = 1;
optional int32 age = 2 [default = 100];
}
如上示例中,test_one.proto 中可以使用 bbb.proto 的类型,但不能使用 aaa.proto 中的类型
9.1、protoc指令
protoc 的参数 -I 和 --proto_path 用于传递 import 的路径
当不同的 proto 文件位于不同的路径时,import 可以不传递相对路径,而使用 -I 或者 --proto_path 传递 import 的查找路径
Protobuf之proto基础语法的更多相关文章
- proto 3 语法
一.简介 proto3是新版本的protobuf语法.它简化了部分语法,并扩大了支持的语言,Ruby.C#.目前谷歌推荐只在是用新支持的语言或使用新的gRPC框架的时候使用.proto2和proto3 ...
- proto 2 语法
一.proto文件 PB的定义是通过proto文件进行定义的,一个标准的类型如下: message SearchRequest { required string query = 1; optiona ...
- iOS 集成Protobuf,转换proto文件
原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...
- [Go] 环境变量,模块化与基础语法
[环境变量] 安装完 go 之后,设置必要环境变量: export GOPATH=/home/wc/go-lab export GO111MODULE=on export GOPROXY=https: ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS-----正则表达式的基础语法
正则表达式简单语法总结 一.什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式.那么一个正 ...
- python之最强王者(2)——python基础语法
背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...
- emmet 系列(1)基础语法
emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...
- Scala基础语法 (一)
如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...
- Java基础语法
java基础学习总结——基础语法1 一.标识符
随机推荐
- SpringCloud Alibaba技术栈(一)微服务介绍
B 站黑马视频教程:Here 源码-笔记:Code for Github 第一章 微服务总览 1. 软件系统架构的历史 软件系统架构大致经历了:单体应用架构->垂直应用架构->分布式架构- ...
- L2-029 特立独行的幸福 (25分) (简单循环 + 素数筛)
对一个十进制数的各位数字做一次平方和,称作一次迭代.如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数.1 是一个幸福数.此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68, ...
- 为什么我要迁移SpringBoot到函数计算
前言 为什么要迁移? 我们的业务有很多对外提供服务的 RESTful API,并且要执行很多不同的任务,例如同步连锁 ERP 中的商品信息到美团/饿了么等平台,在线开发票等.由于各种 API 和任务执 ...
- freeswitch配置SBC实例
概述 freeswitch 是一款好用的开源软交换平台. 随着voip客户的发展和运营商网络的升级换代,SBC在对接测试中的应用场景越来越多. freeswitch通过简单的安装配置即可满足大部分SB ...
- Linux vim-go 开发环境搭建
本文介绍 Linux 下 vim-go 的开发环境搭建.主要参考这篇博客进行的配置,其中记录了几个搭建环境时遇到的问题. 1. vim-go 开发环境搭建 1.1 用户隔离 由于使用的是共享宿主机,为 ...
- phpcms: Warning: "continue" targeting switch is equivalent to "break" 解决方案
Warning: "continue" targeting switch is equivalent to "break". Did you mean to u ...
- http-长连接
1. 短链接 http1.0 -- 1个请求-响应过程会创建且1个新的连接 2. 长连接 http1.1 -- 同域下可以创建1个tcp连接,多个请求在同一个tcp上串行处理请求 http2.0 -- ...
- ONVIF网络摄像头(IPC)客户端开发—最简RTSP客户端实现
前言: 网上对于RTSP协议客户端的表述和实现非常不清晰,在实际使用中,FFMPEG和live555这些软件已经实现了RTSP客户端和服务端的所有功能,但是它们并没有将RTSP协议独立出来,通过看li ...
- [转帖]005、体系结构之TiKV_Raft日志
Raft日志 1.Raft与Multi Raft 2.Raft 日志复制 2.1.复制流程总览 2.2.Propose 2.3.Append 2.3.Replicate(Append) 2.4 Com ...
- [转帖]深入理解mysql-第五章 InnoDB记录存储结构-页结构
前言: 页是InnoDB管理存储空间的基本单位,上一章我们主要分析了页中的主要的构成行的存储结构-行格式,其中简单提了一下页的概念.这章我们详细讲解一下页的存储结构. 一.数据页结构 前边我们简单提了 ...