protobuf 插件(option)使用

news2025/7/15 22:11:24

protobuf的option使用

一、需求

来源于工作中的一个需求:在传递message时需要对message中不同的字段进行不同的处理,而处理方式通过注释标注在了每个字段的定义后。

类似于有下面这样一个消息:

在这里插入图片描述

其中字段1是始终需要的,字段2和3需要在默写条件下才获取。但这是一种one of的结构,因为1 2 3可能同时出现。并且因为time1、time2这些条件是固定的,所以如果可以把他们像从配置文件中一样读出来而不需要传输是最好的,最后找到的解决方案之一就是protobuf的option。




二、protobuf.option

Option是protobuf文件自带的一种属性,通过在.proto文件中标注options来达到在不影响整个文件中消息含义的情况下支持对protobuf在特定环境下的特定处理。

Option 分为三个级别:FileOptions MessageOptions FieldOptions

2.1 FileOptions

文件级属性,作用于一个最外的范围,不包含在任何消息内部、enum或服务定义中。

Protobuf自带一些文件级option,主要是作用于编程语言级的操作,例如:

    1. java_package**
      · 这个选项表明生成java类所在的包。如果在.proto文件中没有明确的声明java_package,就采用默认的包名。当然了,默认方式产生的 java包名并不是最好的方式,按照应用名称倒序方式进行排序的。如果不需要产生java代码,则该选项将不起任何作用。如:option java_package = “com.example.foo”;
    1. cc_enable_arenas**
      对于C++产生的代码启用arena allocation。

自带的文件级option在decriptor.proto 中;

**2.2 MessageOptions **

消息级option被定义在消息定义的内部,也有些选项可以作用在域、enum、类型及服务中。




2.3 FieldOptions

字段级option只起效于消息中的单个字段。

三、代码使用示例

以上三种option都支持自定义,代码示例如下:

.proto文件中定义自己需要的option, 下图分别定义了文件、消息、字段级的option各一个,其中文件级option是个string,其余两个是个message,并且对文件级option定义后直接赋值

在这里插入图片描述

接下来,定义了三个消息,每个消息都定义了自己的消息级option, 然后三个消息分别定义了 0条字段option , 1条字段option , 每个字段都有option ;
在这里插入图片描述

最后在CPP中:

定义了一个PBInfo保存每条消息的相关option,以及一个解析的函数和输出函数

然后对三种消息解析并输出:
在这里插入图片描述

最终结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络:静态路由的应用场景及配置

章节:静态路由(部分内容参考:《华为HCIA-Datacom认证学习指南》) 《华为 HCIA-Datacom认证学习指南》 目录 一、静态路由应用场景 二、静态路由配置 2.1 实验目的 2.2 实验拓扑 2.3 实验步骤 1.配置网络连通性 2.测试网络…

双节前把我的网站重构了一遍

赶在中秋国庆假期前,终于将我的网站(https://spacexcode.com/[1])结构定好了,如之前所说,这个网站的定位就是作为自己的前端知识沉淀。内容大致从:前端涉及的基础知识分类汇总(知识库&#xff0…

kafka 相关概念

1 kafka 生产者 kafka 用push的方式把消息推送到topic 每个topic下可以有多个分区, 可以用hash 也可以用轮询的方式指定分区 每个分区内部是可以保证顺序的,但是整体无法保证顺序,除非设置成一个topic只有一个分区。 kafka这种多分区的设置 带…

Elasticsearch 8.11 中的合并更少,摄取更快

作者:ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式,从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改,这有助于减少合并开销,从而加快索引速度。 使用我们的日志跟踪&#x…

嵌入式学习笔记(56)LCD的接口技术

12.2.1从电平角度讲本质上都是TTL信号 (1)什么是TTL接口。5V表示逻辑1,0V表示逻辑0。这种就叫TTL电平,和CMOS电平相对比。 (2)SoC的LCD控制器硬件接口是TTL电平的,LCD这边硬件接口也是TTL电平的。所以他们俩本来是可以直接对接的&#xff0…

我测试用的mark down教程

Markdown 教程 欢迎使用 Markdown 你好,Markdown是一种类似 Word 的排版工具,你需要仔细阅读这篇文章,了解一下 Markdown 基础知识。 Markdown 功能和列表演示 Markdown 有以下功能,帮助你用它写博客: 数学公式代码高亮导航功能等等Markdown 的优点: 间接高效大厂支持…

供应链 | MSOM论文解读:零售商响应定价能力对供应链韧性的影响

​ 论文解读:温梓曦,肖善,杨子豪,张怡雯 A Responsive-Pricing Retailer Sourcing from Competing Suppliers Facing Disruptions 原文作者信息: Xi Shan, Tao Li, Suresh P. Sethi (2021) A Responsive-Pricing Ret…

邮箱发送验证码(nodemailer)

邮箱发送验证码(nodemailer) 前言:后端实现1、前期准备2、安装nodemailer3、代码实现4、效果图 前言: 想要实现向邮箱发送验证码功能,先来简单地梳理一下思路: 前端用正则表达式简单验证下邮箱格式的正确性…

springboot+vue+java付费自习室选座系统nl1u1

本系统从用户的角度出发,结合当前的环境而开发的,在开发语言上是使用的Java语言,在框架上我们是使用的springboot框架,数据库方面使用的是MySQL数据库,开发工具为IDEA。 付费自习室管理系统根据实际情况分为前后台两部…

ROS键盘遥控机器人,通过参数服务器指定速度

1、引言 在上节的驱动机器人,我们知道是cmd_vel话题发布一串Twist类型消息来控制,我们可以输入如下命令查看这个Twist的详细信息:rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geome…

Linux 编写一个 简单进度条

进度条 回车换行理解: 我们要理解,回车换行是两个概念: 换行是把光标移到下一行,是竖直的往下平移;" \n "回车是把光标移到当前行的最开始; " \r " 就和一起打字…

[计算机提升] Windows系统权限

1.2 Windows系统权限 在Windows操作系统中,权限是指授予用户或用户组对系统资源进行操作的权利。权限控制是操作系统中重要的安全机制,通过权限控制可以限制用户对系统资源的访问和操作,从而保护系统安全。 Windows操作系统中包含以下几种权…

FPGA设计时序约束五、设置时钟不分析路径

一、背景 在进行时序分析时,工具默认对所有的时序路径进行分析,在实际的设计中,存在一些路径不属于逻辑功能的,或者不需要进行时序分析的路径,使用set_false_path对该路径进行约束,时序分析时工具将会直接忽…

通过onnxruntime进行模型部署过程中的问题

1.onnxruntime包 从https://github.com/microsoft/onnxruntime/releases/下载解压到D:/code/package/onnruntime 2opencv_c下载https://github.com/opencv/opencv/releases/tag/4.8.1 3.测试opencv代码:总结:添加include目录,添加lib库目录…

网工配置命令总结(1)---Web访问及vlan配置

目录 1.Telnet远程登录设备 2.用户通过Web网管登录设备 3.端口隔离功能的实现 4.配置vlan聚合 5.部分vlan间互通&#xff0c;部分vlan间隔离&#xff0c;vlan内用户隔离 6.限制内网网段互访 1.Telnet远程登录设备 1.使能服务器功能 <HUAWEI> system-view [HUAWEI] …

Eslint配置 Must use import to load ES Module(已解决)

最近在配置前端项目时&#xff0c;eslint经常会碰到各种报错&#xff08;灰常头疼~&#xff09; Syntax Error Error No ESLint configuration found.Syntax Error: Error: D:\dmq\dmq-ui.eslintrc.js: Environment key “es2021” is unknown at Array.forEach ()error in ./…

GO 语言处理并发的时候我们是选择sync还是channel

以前写 C 的时候&#xff0c;我们一般是都通过共享内存来通信&#xff0c;对于并发去操作某一块数据时&#xff0c;为了保证数据安全&#xff0c;控制线程间同步&#xff0c;我们们会去使用互斥锁&#xff0c;加锁解锁来进行处理 然而 GO 语言中建议的时候通过通信来共享内存&…

看图学习数据中心机柜导轨方面的英文术语

对于一些数据中心的服务器&#xff0c;存储&#xff0c;交换机等设备的上架安装&#xff0c;有些导轨设计还是有点复杂的&#xff0c;如果安装手册还是英文的&#xff0c;就更有些挑战了。本文用一个实际的导轨图片来对其中常用的一些英文术语做了一个详细解释&#xff0c;供朋…

面试官:Go GMP 模型为什么 P 组件如此重要 ?

大家好&#xff0c;我是木川 Go GMP模型 是 Go语言并发性能的关键组成部分&#xff0c;它允许轻松创建大量的 Goroutines&#xff0c;设计思想包括并行性、线程复用以及抢占调度。 Go 1.1 版本前采用的是 GM 模型&#xff0c;存在一些问题&#xff0c;后面增加了 P 组件&#x…

哪种烧录单片机的方法合适?

哪种烧录单片机的方法合适&#xff1f; 首先&#xff0c;让我们来探讨一下单片机烧录的方式。虽然单片机烧录程序的具体方法会因为单片机型号、然后很多小伙伴私我想要嵌入式资料&#xff0c;通宵总结整理后&#xff0c;我十年的经验和入门到高级的学习资料&#xff0c;只需一…