.proto文件有两种语法标准:proto2和proto3,我们以proto3为例,其语法格式如下:

message  <message_name> {<filed_rule>  <filed_type> <filed_name> = <field_number> 规则          类型          名称           编号
}
  • message_name: 同一个pkg内,必须唯一
  • filed_rule: 可以没有, 常用的有repeated, oneof
  • filed_type: 数据类型, protobuf定义的数据类型, 生产代码的会映射成对应语言的数据类型
  • filed_name: 字段名称, 同一个message 内必须唯一
  • field_number: 字段的编号, 序列化成二进制数据时的字段编号

2.1.1、字段规则

2.1.2、字段类型

基础类型

参考官方文档(Language Guide (proto3)  |  Protocol Buffers  |  Google Developers),我这里只保留了我常用编程语言的字段类型

.proto Type Notes C++ Type Python Type[3] C# Type
double double float double
float float float float
int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. int32 int int
int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. int64 int/long[4] long
uint32 Uses variable-length encoding. uint32 int/long[4] uint
uint64 Uses variable-length encoding. uint64 int/long[4] ulong
sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. int32 int int
sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. int64 int/long[4] long
fixed32 Always four bytes. More efficient than uint32 if values are often greater than 228. uint32 int/long[4] uint
fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 256. uint64 int/long[4] ulong
sfixed32 Always four bytes. int32 int int
sfixed64 Always eight bytes. int64 int/long[4] long
bool bool bool bool
string A string must always contain UTF-8 encoded or 7-bit ASCII text, and cannot be longer than 232. string str/unicode[5] string
bytes May contain any arbitrary sequence of bytes no longer than 232. string str (Python 2)
bytes (Python 3)
ByteString

枚举类型

语法如下:

enum <enum_name> {<element_name> = <element_number>
}
  • enum_name: 枚举名称
  • element_name: pkg内全局唯一, 很重要
  • element_number: 必须从0开始, 0表示类型的默认值, 32-bit integer

如下示例,Corpus就是我们定义的一个枚举类型。

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;
}

如果需要将不同的枚举常量映射到相同的值。将allow_alias选项设置为true即可。(最好不要这么使用)

message MyMessage1 {enum EnumAllowingAlias {option allow_alias = true;UNKNOWN = 0;STARTED = 1;RUNNING = 1;}
}
message MyMessage2 {enum EnumNotAllowingAlias {UNKNOWN = 0;STARTED = 1;// RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.}
}

2.1.3、字段编号

2.1.4、综合示例

Protobuf(二)proto3语法格式相关推荐

  1. Protobuf 学习手册——语法篇

    一.Override Protobuf1 是一种语言中立.平台无关.可扩展的序列化数据的格式,可用于通信协议,数据存储等. ProtoBuf 在序列化数据方面,它是灵活的.高效的.相比于 XML 来说 ...

  2. 通信协议以及protobuf使用、语法指南一

    文章目录 1.设计通信协议 2.协议设计范例 范例一 IM即时通讯协议 范例二 云平台节点服务器 3.序列化和反序列化基础 4.xml/json/protobuf对比及使用场景 5.protobuf安 ...

  3. linux ATT汇编 与 Intel汇编 语法格式对比

    由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&a ...

  4. Protobuf 的 proto3 与 proto2 的区别

    Protobuf 的 proto3 与 proto2 的区别 转载自:https://solicomo.com/network-dev/protobuf-proto3-vs-proto2.html 这 ...

  5. java表达式语法格式为_2009(选修)JavaWeb模拟试卷(2011-2012)

    第 1 页 共 3 页 成都学院(成都大学)考试试卷 课程名称:_ JavaWeb (闭卷) _2011_-_2012_学年 第_2_学期 一. 填空题(每空3分,共30分) 1.在Tomcat 上发 ...

  6. python异常处理的语法格式_Python异常处理

    Python异常处理 一. 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常. 程序停止执行并且提示错误信息 这个动作,我们 ...

  7. JavaSE——XML与JSON(语法格式、解析内容)

    第6节 XML与JSON 一.XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) . 特性: xml具有平台无关性,是一门独立的标记语言: ...

  8. php基本语法 格式,PHP 基本语法格式

    PHP 基本语法格式 标准代码如下: 复制代码 代码如下: ... ?> 短标签模式(此模式需要修改PHP配置,让PHP支持短标签模式): 复制代码 代码如下: ... ?> 注释: 复制 ...

  9. NETCONF YANG语言文件语法格式

    NETCONF简介:https://blog.csdn.net/Rong_Toa/article/details/104297006 Table of Contents 一.Modules与Submo ...

最新文章

  1. 基本数据类型_JavaScript基本数据类型
  2. Mybatis多条件直接查询Param注解版
  3. python drop_duplicates_Pandas drop_duplicates方法不起作用
  4. Netty 编解码器和 Handler 调用机制
  5. 考研(一):一段不错的经历之考研总结
  6. HDU 2063 过山车
  7. oracle中isnumber函数,Oracle 函数isnumber问题
  8. unity之EasyAR使用
  9. rs232 485 ttl区别
  10. matlab进行预测误差过大,神经网络预测误差太大怎么办,如何看预测结果
  11. win7休眠开启与关闭
  12. 创龙科技Zynq-7010/20工业开发板(双核ARM Cortex-A9+A7)-性能及参数资料
  13. 半路出家的菜鸡程序员,北漂五年,给刚入行朋友的一些忠告,发自肺腑
  14. 与欢聚十年终成就百度 不吃老本的YY直播还能有“黄金时代吗?
  15. AcWing 125. 耍杂技的牛 (推公式)
  16. larvel 5.7命令行cmd常用命令
  17. android开源app简书,参考APP, 开发, 发布
  18. 讯飞星火大模型V1.5发布 刘庆峰:我们要追赶OpenAI
  19. 真空泵的选择计算 (1)
  20. 一篇文章了解_docker

热门文章

  1. PCA中whiten参数
  2. 云知声依托人工智能先发优势,率先入局ChatGPT
  3. The 15th Chinese Northeast Collegiate Programming Contest 题解(CCPC压力测试?
  4. wsl运行ubuntu切换默认登录用户
  5. 科研工具--HistCite
  6. 京东手机评论数据挖掘之二:情感分析
  7. [NLU] Improving Multi-turn Dialogue Modelling with Utterance ReWriter
  8. ICCV2017 UCT:学习统一卷积网络进行实时可视化跟踪---论文笔记
  9. 2022年吉利集团主题研究报告
  10. C语言文件详解(超级详细,记得收藏~~~)