proto3语言指南
Language Guide (proto3)
本指南介绍了如何使用 protocol buffer 语言来构建protocol buffer数据,包括.proto文件语法以及如何从.proto 文件生成数据访问类。它涵盖了proto3 版本的协议缓冲语言:有关proto2语法的信息,请参阅proto2语言指南。
文章目录
- Language Guide (proto3)
- @[toc]
- 定义一个消息类型 Defining A Message Type
- 指定字段类型 Specifying Field Types
- 指定字段编号 Assigning Field Numbers
- 重复使用字段号的后果 Consequences of Reusing Field Numbers
- 指定字段标签 Specifying Field Labels
- 格式良好的消息 Well-formed Message
- 添加更多的消息类型 Adding More Message Types
- 添加注释 Adding Comments
- 删除字段 Deleting Fields
- 保留字段 Reserved Fields
- 从 .proto 中生成了什么?
- 标量值类型 Scalar Value Types
- 默认值
- 枚举
- 保留值 Reserved Values
- 使用其他消息类型 Using Other Message Type
- 导入定义 Importing Definitions
- 使用 proto2 消息类型
- 嵌套类型 Nested Types
- 更新一个消息类型 Updating A Message Type
- 未知字段 Unknown Fields
- Any
- Oneof
- 使用 Oneof
- Oneof 特性
- 向后兼容性问题
- 标记重用问题 Tag Reuse Issues
- Maps
- Maps特性
- 向后兼容性
- Packages
- Packages 和名称解析
- 定义服务 Defining Services
- JSON 映射
- JSON 选项
- 选项
- 枚举值选项
- 自定义选项
- Option Retention
- Option Targets
- 生成类 Generating Your Classes
- 文件未知 File location
- 未知应不受语言限制
- 支持的平台
文章目录
- Language Guide (proto3)
- @[toc]
- 定义一个消息类型 Defining A Message Type
- 指定字段类型 Specifying Field Types
- 指定字段编号 Assigning Field Numbers
- 重复使用字段号的后果 Consequences of Reusing Field Numbers
- 指定字段标签 Specifying Field Labels
- 格式良好的消息 Well-formed Message
- 添加更多的消息类型 Adding More Message Types
- 添加注释 Adding Comments
- 删除字段 Deleting Fields
- 保留字段 Reserved Fields
- 从 .proto 中生成了什么?
- 标量值类型 Scalar Value Types
- 默认值
- 枚举
- 保留值 Reserved Values
- 使用其他消息类型 Using Other Message Type
- 导入定义 Importing Definitions
- 使用 proto2 消息类型
- 嵌套类型 Nested Types
- 更新一个消息类型 Updating A Message Type
- 未知字段 Unknown Fields
- Any
- Oneof
- 使用 Oneof
- Oneof 特性
- 向后兼容性问题
- 标记重用问题 Tag Reuse Issues
- Maps
- Maps特性
- 向后兼容性
- Packages
- Packages 和名称解析
- 定义服务 Defining Services
- JSON 映射
- JSON 选项
- 选项
- 枚举值选项
- 自定义选项
- Option Retention
- Option Targets
- 生成类 Generating Your Classes
- 文件未知 File location
- 未知应不受语言限制
- 支持的平台
定义一个消息类型 Defining A Message Type
首先我们来看一个非常简单的例子。假设您想要定义一个搜索请求消息格式,其中每个搜索请求都有一个查询字符串、您感兴趣的特定页面的结果以及每页的结果数。这是用于定义消息类型的.proto文件。
syntax = "proto3";message SearchRequest {string query = 1;int32 page_number = 2;int32 results_per_page = 3;
}
- 文件的第一行指定您正在使用proto3语法:如果您不这样做,protocol buffer编译器将假设您正在使用proto2。这必须是文件的第一个非空、非注释行。
- SearchRequest消息定义指定了三个字段(名称/值对),每个字段对应要包含在此类消息中的每条数据。每个字段都有一个名称和一个类型。
指定字段类型 Specifying Field Types
在前面的示例中,所有字段都是标量类型:两个整数(page_number 和 results_per_page)和一个字符串(query)。您还可以像为字段指定其他消息类型一样,指定枚举和复合类型。
指定字段编号 Assigning Field Numbers
您必须为消息定义中的每个字段提供一个介于 1 和 536870911 之间的数字,但有以下限制:
- 给定的数字在该消息的所有字段中必须是唯一的。
- 字段号 19000 至 19999 保留用于protocol buffer的实现。如果您在消息中使用了这些保留字段号中的一个,则protocol buffer编译器会抱怨。
- 您不能使用任何以前保留的字段号或已分配给扩展名的任何字段号。
一旦使用消息类型,就不能更改此数字,因为它以消息有线格式标识字段。“更改”字段编号相当于删除该字段并创建一个具有相同类型但具有新编号的新字段。请参阅删除字段以了解如何正确执行此操作。
字段号不应重复使用。永远不要将字段号从保留列表中删除,以便与新的字段定义一起重用。请参阅重复使用字段编号的后果。
对于最频繁设置的字段,应使用字段编号 1 到 15。较低的字段编号值在导线格式中占用的空间较小。例如,范围为1到15的字段编号需要一个字节进行编码。在 16 到 2047 范围内的字段编号占用两个字节。您可以在Protocol Buffer Encoding 中找到更多关于这方面的信息。
重复使用字段号的后果 Consequences of Reusing Field Numbers
重复使用字段号会使线性格式(wire format)消息的解码变得不明确。
protobuf-wire格式是精简的,不能提供一种方法来检测使用一种定义编码并使用另一种定义解码的字段。
使用一个定义对字段进行编码,然后使用不同的定义对同一字段进行解码,可能会导致:
- 开发人员在调试过程中损失的时间
- 解析/合并错误(最佳情况)
- 泄露的 PII/SPII
- 数据损坏
字段号重复使用的常见原因:
- 对字段重新编号(有时这样做是为了使字段的编号顺序更美观)。重新编号可以有效地删除和重新添加重新编号中涉及的所有字段,从而导致不兼容的线性格式更改。
- 删除字段而不保留数字以防止将来重复使用。
最大字段是29位,而不是更典型的32位,因为三个较低的位用于线性格式。有关此方面的详细信息,请参阅编码主题。
指定字段标签 Specifying Field Labels
消息字段可以是以下字段之一:
-
optional: 可选字段处于两种可能状态之一:
- 字段已设置,并且包含从线性显式设置或解析的值。它将被串行化到线上。
- 该字段未设置,将返回默认值。它不会被序列化到线上。
您可以检查该值是否已显式设置。
-
repeated:此字段类型可以在格式良好的消息中重复零次或多次。重复值的顺序将被保留。
-
map:这是一个成对的键/值字段类型。有关此字段类型的详细信息,请参见 Maps。
-
如果未应用显式字段标签,则假定为默认字段标签,称为“隐式字段存在”。(不能将字段显式设置为此状态。)格式正确的消息可以有零个或一个字段(但不能超过一个)。您也无法确定是否从线分析了此类型的字段。除非隐式存在字段是默认值,否则它将被序列化到线。有关此主题的更多信息,请参阅Field Presence。
在proto3中,标量数字类型的重复字段默认使用压缩编码。您可以在 Protocol Buffer Encoding 中找到有关压缩编码的更多信息。
格式良好的消息 Well-formed Message
当应用于protobuf消息时,术语“格式良好”指的是序列化/反序列化的字节。proto解析器验证给定的proto定义文件是可解析的。
在可选字段有多个值的情况下,protoc解析器将接受输入,但只使用最后一个字段。因此,“字节”可能不是“格式良好”的,但生成的消息只有一个,并且是“格式良好的”(但不会往返相同的消息)。
添加更多的消息类型 Adding More Message Types
在一个.proto文件中可以定义多个消息类型。如果您正在定义多个相关消息,这将非常有用,例如,如果您想定义与SearchResponse消息类型相对应的回复消息格式,可以将其添加到同一格式中。proto:
message SearchRequest {string query = 1;int32 page_number = 2;int32 results_per_page = 3;
}message SearchResponse {...
}
组合消息会导致膨胀虽然可以在单个.proto文件中定义多个消息类型(如消息、枚举和服务),但当在单个文件中定义大量具有不同依赖关系的消息时,也会导致依赖关系膨胀。建议每个.proto文件包含尽可能少的消息类型。
添加注释 Adding Comments
要在.proto文件中添加注释,请使用C/C++样式 // 和 /* ... */ 语法。
/* * SearchRequest represents a search query, with pagination options to* indicate which results to include in the response. */message SearchRequest {string query = 1;int32 page_number = 2; // Which page number do we want?int32 results_per_page = 3; // Number of results to return per page.
}
删除字段 Deleting Fields
如果操作不当,删除字段可能会导致严重问题。
当您不再需要字段并且所有引用都已从客户端代码中删除时,您可以从消息中删除字段定义。但是,您必须保留已删除的字段编号。如果不保留字段编号,开发人员将来可能会重用该编号。
您还应该保留字段名,以允许消息的 JSON 和 TextFormat 编码继续解析。
保留字段 Reserved Fields
如果通过完全删除字段或注释掉字段来更新消息类型,未来的开发人员可以在对该类型进行自己的更新时重用字段号。这可能会导致严重的问题,如重复使用字段编号的后果中所述。
要确保不会发生这种情况,请将已删除的字段号添加到保留列表中。为了确保消息的JSON和TextFormat实例仍然可以解析,还可以将删除的字段名添加到保留列表中。
如果将来的开发人员试图使用这些保留的字段号或名称,protocol buffer编译器会抱怨。
message Foo {reserved 2, 15, 9 to 11;reserved "foo", "bar";
}
保留字段编号范围包括在内(9到11与9、10、11相同)。请注意,不能在同一保留语句中混用字段名和字段号。
从 .proto 中生成了什么?
当你在.proto上运行protocol buffer编译器时,编译器会用你选择的语言生成代码,你需要使用文件中描述的消息类型,包括获取和设置字段值,将消息序列化到输出流,以及从输入流解析消息。
- 对于C++,编译器从每个.proto生成一个.h和.cc文件,文件中描述的每个消息类型都有一个类。
- 对于Java<
相关文章:
proto3语言指南
Language Guide (proto3) 本指南介绍了如何使用 protocol buffer 语言来构建protocol buffer数据,包括.proto文件语法以及如何从.proto 文件生成数据访问类。它涵盖了proto3 版本的协议缓冲语言:有关proto2语法的信息,请参阅proto2语言指南。 文章目录 Language Guide (pro…...
解决后端传给前端的日期问题
解决方式: 1). 方式一 在属性上加上注解,对日期进行格式化 但这种方式,需要在每个时间属性上都要加上该注解,使用较麻烦,不能全局处理。 2). 方式二(推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…...
MySQL中的索引失效情况介绍
MySQL中的索引是提高查询性能的重要工具。然而,在某些情况下,索引可能无法发挥作用,甚至导致查询性能下降。在本教程中,我们将探讨MySQL中常见的索引失效情况,以及它们的特点和简单的例子。 1. **索引失效的情况** …...
SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法
问题: java: 无法访问org.mybatis.spring.annotation.MapperScan 错误的类文件: /D:/Program Files/apache-maven-3.6.0/repository/org/mybatis/mybatis-spring/3.0.3/mybatis-spring-3.0.3.jar!/org/mybatis/spring/annotation/MapperScan.class 类文件具有错误的…...
Cloudways搭建WordPress外贸独立站完整教程
现在做个网站不比从前了,搭建网站非常的简单,主要是由于开源的CMS建站系统的崛起,就算不懂编程写代码的人也能搭建一个自己的网站,这些CMS系统提供了丰富的主题模板和插件,使用户可以通过简单的拖放和配置操作来建立自…...
关于 闰年 的小知识,为什么这样判断闰年
闰年的规定: 知道了由来,我们就可以写程序来判断: #include <stdio.h> int main() {int year, leap;scanf("%d",&year);if((year%4 0 && year%100 ! 0) || year%400 0)leap 1;else leap 0;if(leap) printf(…...
Elasticsearch:调整近似 kNN 搜索
在我之前的文章 “Elasticsearch:调整搜索速度”,我详细地描述了如何调整正常的 BM25 的搜索速度。在今天的文章里,我们来进一步探讨如何提高近似 kNN 的搜索速度。希望对广大的向量搜索开发者有一些启示。 Elasticsearch 支持近似 k 最近邻…...
UE5数字孪生系列笔记(二)
智慧城市数字孪生系统 制作流云动画效果 首先添加一个图像在需要添加流云效果的位置 添加动画效果让其旋转 这个动画效果是程序开始就要进行的,所以要在EventConstruct中就可以启动这个动画效果 添加一个一样的图像在这里,效果是从此处进行放大消散 添…...
基于vue实现bilibili网页
学校要求的实验设计,基于vue实现bilibili网页版,可实现以下功能 (1)基本的悬浮动画和页面渲染 (2)可实现登录和未登录的页面变化 (3)在登录页面的,实现密码判断,或者短信验证方式的倒数功能 (4)实现轮播图 (5)实现预览视频(GIF) (6)页面下拉到一定高度出现top栏以及右下角的返回…...
计算机二级(Python)真题讲解每日一题:《十字叉》
描述 …...
基于正点原子潘多拉STM32L496开发板的简易示波器
一、前言 由于需要对ADC采样性能的评估,重点在于对原波形的拟合性能。 考虑到数据的直观性,本来计划采集后使用串口导出,并用图形做数据拟合,但是这样做的效率低下,不符合实时观察的需要,于是将开发板的屏幕…...
【Docker】apisix 容器化部署
APISIX环境标准软件基于Bitnami apisix 构建。当前版本为3.8.0 你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-platform qi…...
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的障碍物检测系统(深度学习代码+UI界面+训练数据集)
摘要:开发障碍物检测系统对于道路安全性具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个障碍物检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能…...
从零开始学HCIA之SDN04
1、VXLAN数据封装 (1)Original L2 Frame,原始以太网报文,业务应用的以太网帧。 (2)VXLAN Header,VXLAN协议新定义的VXLAN头,长度为8字节。VXLAN ID(VNI)为2…...
GET 和 POST 有什么区别?
1.从缓存的角度,GET 请求会被浏览器主动缓存下来,留下历史记录,而 POST 默认不会。 2.从编码的角度,GET 只能进行 URL 编码,只能接收 ASCII 字符,而 POST 没有限制。 3.从参数的角度,GET 一般放…...
Qt学习--继承(并以分文件实现)
基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名。 总结:简单来说,父类有的,子…...
软考75-上午题-【面向对象技术3-设计模式】-设计模式的要素
一、题型概括 上午、下午题(试题五、试题六,二选一) 每一个设计模式都有一个对应的类图。 二、23种设计模式 创建型设计模式:5 结构型设计模式:7 行为设计模式:11 考试考1-2种。 三、设计模式的要素 3…...
Matlab|面向低碳经济运行目标的多微网能量互联优化调度
目录 主要内容 优化流程 部分程序 结果一览 下载链接 主要内容 该程序为多微网协同优化调度模型,系统在保障综合效益的基础上,调度时优先协调微网与微网之间的能量流动,将与大电网的互联交互作为备用,降低微网与大电…...
3.Gen<I>Cam文件配置
Gen<I>Cam踩坑指南 我使用的是大恒usb相机,第一步到其官网下载大恒软件安装包,安装完成后图标如图所示,之后连接相机,打开软件,相机显示一切正常。之后查看软件的安装目录如图,发现有GenICam和GenTL两个文件&am…...
【兆易创新GD32H759I-EVAL开发板】 TLI(TFT LCD Interface)用法详细介绍
大纲 1. 引言 2. TLI外设特点 3. TLI硬件架构 4. TLI寄存器功能 5. TLI的配置和使用步骤 6. TLI图层概念 7. 图像处理和显示优化 8. 基于GD32H759I-EVAL开发板的TLI应用示例 1. 引言 在当今的嵌入式系统设计中,图形用户界面(GUI)的应…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
