[C++][ProtoBuf][Proto3语法][一]详细讲解
目录
- 1.字段规则
- 2.消息类型的定义与使用
- 1.定义
- 2.使用
- 3.enum类型
- 1.语法
- 2.定义时注意
- 3.代码
1.字段规则
- 消息的字段可以⽤下⾯⼏种规则来修饰:
singular
:消息中可以包含该字段零次或⼀次(不超过⼀次)- proto3语法中,字段默认使⽤该规则
repeated
:消息中可以包含该字段任意多次(包括零次),其中重复值的顺序会被保留- 可以理解为定义了⼀个数组
- 示例:表示一个通讯录里有多个人的信息
message Contacts {repeated PeopleInfo contacts = 1; }
2.消息类型的定义与使用
1.定义
- 在单个
.proto
⽂件中可以定义多个消息体,且⽀持定义嵌套类型的消息(任意多层)- 每个消息体中的字段编号可以重复
- 更新
contacts.proto
,可以将phone_number
提取出来,单独成为⼀个消息// -------------------------- 嵌套写法 ------------------------- syntax = "proto3"; package contacts;message PeopleInfo {string name = 1; int32 age = 2; message Phone {string number = 1;} } // -------------------------- ⾮嵌套写法 ------------------------ syntax = "proto3"; package contacts;message Phone {string number = 1; }message PeopleInfo {string name = 1; int32 age = 2; }
2.使用
- 消息类型可作为字段类型使用
syntax = "proto3"; package contacts;// 联系⼈ message PeopleInfo {string name = 1; int32 age = 2; message Phone {string number = 1; }repeated Phone phone = 3; }
- 可导入其他
.proto
文件的消息并使用:import
导入syntax = "proto3"; package contacts; import "phone.proto"; // 使⽤ import 将 phone.proto ⽂件导⼊进来message PeopleInfo {string name = 1; int32 age = 2; // 引⼊的⽂件声明了package,使⽤消息时,需要⽤ ‘命名空间.消息类型’ 格式 repeated phone.Phone phone = 3; }
- 注意:在proto3⽂件中可以导⼊proto2消息类型并使⽤它们,反之亦然
- 说明:
- 每个字段都有⼀个
clear_
⽅法,可以将字段重新设置回empty
状态 - 每个字段都有设置和获取的⽅法, 获取⽅法的⽅法名称与字段命名完全相同
- 但如果是消息类型的字段,其设置⽅法为
mutable_
⽅法,返回值为消息类型的指针,这类⽅法会为用户开辟好空间,可以直接对这块空间的内容进⾏修改mutable
-> 访问和修改消息字段中的嵌套消息
- 但如果是消息类型的字段,其设置⽅法为
- 对于使⽤
repeated
修饰的字段,也就是数组类型,pb为用户提供:add_
⽅法来新增⼀个值_size
⽅法来判断数组存放元素的个数
- 每个字段都有⼀个
3.enum类型
1.语法
- 语法:
enum Type {}
- 注意:
- 0值常量必须存在,且要作为第⼀个元素
- 这是为了与proto2的语义兼容:第⼀个元素作为默认值,且值为0
- 枚举类型可以在消息外定义,也可以在消息体内定义(嵌套)
- 枚举的常量值在32位整数的范围内
- 负值⽆效,所以不建议使⽤负值
- 0值常量必须存在,且要作为第⼀个元素
2.定义时注意
- 将两个"具有相同枚举值名称"的枚举类型放在单个
.proto
⽂件下测试时,编译后会报错:某某某常量已经被定义,所以这⾥要注意:- 同级(同层)的枚举类型,各个枚举类型中的常量不能重名
enum PhoneType {MP = 0;TEL = 1; } enum PhoneTypeCopy {MP = 0; // ERROR:MP 已经定义 }
- 单个
.proto
⽂件下,最外层枚举类型和嵌套枚举类型,不算同级enum PhoneTypeCopy {MP = 0; // ⽤法正确 }message Phone {string number = 1;enum PhoneType {MP = 0;TEL = 1;} }
- 多个
.proto
⽂件下,若⼀个⽂件引⼊了其他⽂件,且每个⽂件都未声明package
,每个proto⽂件中的枚举类型都在最外层,算同级// phone1.proto import "phone1.proto" enum PhoneType {MP = 0; // ERROR:MP 已经定义TEL = 1; }// phone2.proto enum PhoneTypeCopy {MP = 0; }
- 多个
.proto
⽂件下,若⼀个⽂件引⼊了其他⽂件,且每个⽂件都声明了package
,不算同级// phone1.proto import "phone1.proto" package phone1; enum PhoneType {MP = 0; // ⽤法正确TEL = 1; }// phone2.proto package phone2; enum PhoneTypeCopy {MP = 0; }
- 同级(同层)的枚举类型,各个枚举类型中的常量不能重名
3.代码
- 编译生成的CPP代码:
// 新⽣成的 PeopleInfo_Phone_PhoneType 枚举类 enum PeopleInfo_Phone_PhoneType : int {PeopleInfo_Phone_PhoneType_MP = 0,PeopleInfo_Phone_PhoneType_TEL = 1,PeopleInfo_Phone_PhoneType_PeopleInfo_Phone_PhoneType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),PeopleInfo_Phone_PhoneType_PeopleInfo_Phone_PhoneType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max() };// 更新的 PeopleInfo_Phone 类 class PeopleInfo_Phone final : public ::PROTOBUF_NAMESPACE_ID::Message { public:typedef PeopleInfo_Phone_PhoneType PhoneType;static inline bool PhoneType_IsValid(int value) {return PeopleInfo_Phone_PhoneType_IsValid(value);}template<typename T>static inline const std::string& PhoneType_Name(T enum_t_value) {...}static inline bool PhoneType_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name, PhoneType* value) {...}// .contacts.PeopleInfo.Phone.PhoneType type = 2;void clear_type();::contacts::PeopleInfo_Phone_PhoneType type() const;void set_type(::contacts::PeopleInfo_Phone_PhoneType value); };
- 上述的代码中
- 对于在
.proto
⽂件中定义的枚举类型,编译⽣成的代码中会含有- 与之对应的枚举类型
- 校验枚举值是否有效的⽅法
_IsValid
- 以及获取枚举值名称的⽅法
_Name
- 对于使⽤了枚举类型的字段,包含设置和获取字段的⽅法,已经清空字段的⽅法
clear_
- 对于在
相关文章:

[C++][ProtoBuf][Proto3语法][一]详细讲解
目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则 消息的字段可以⽤下⾯⼏种规则来修饰: singular:消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中,字段默认使⽤该规则 repeat…...

千古雄文《渔樵问对》原文、译文、解析
邵雍《渔樵问对》:开悟奇文,揭示世界的终极意义 【邵雍《渔樵问对》:开悟奇文,揭示世界的终极意义】 邵雍(1011年1月21日-1077年7月27日,宋真宗大中祥符四年十二月二十五日戌时生至神宗熙宁十…...

uniapp 开发备忘录-防坑指南
uniapp 开发备忘录-防坑指南 npm run dev:mp-weixin 编译微信小程序报错: [plugin:uni:mp-using-component] Expected ‘,’ or ‘}’ after property value in JSON at position 解决方案:升级uniapp 到最新 alpha 版。(2024年7月13日&am…...

Simple_ReAct_Agent
参考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph,以下为代码的实现。 Basic ReAct Agent(manual action) import openai import re import httpx import os from dotenv import load_dotenv, find_dotenvOPENAI_API_KEY os.getenv(OPEN…...

window wsl安装ubuntu
文章目录 wsl安装ubuntu什么是wsl安装wsl检查运行 WSL 2 的要求将 WSL 2 设置为默认版本查看并安装linux WSL2的使用如何查看linux文件wsl如何使用代理:方法1:方法2:通过 DNS 隧道来配置 WSL 的网络 如何将 WSL 接入局域网并与宿主机同网段使用VScode连接…...

postmessage()在同一域名下,传递消息给另一个页面
这里是同域名下,getmessage.html(发送信息)传递消息给index.html(收到信息,并回传收到信息) index.html页面 <!DOCTYPE html> <html><head><meta http-equiv"content-type"…...

初始redis:在Ubuntu上安装redis
1.先切换到root用户 使用su命令切换到root 2.使用apt命令来搜索redis相关的软件包 命令:apt search redis 3.下载redis 命令: apt install redis 在Ubuntu 20.04中 ,下载的redis版本是redis5 4.查看redis状态 命令: netst…...

生物素结合金纳米粒子(Bt@Au-NPs ) biotin-conjugated Au-NPs
一、定义与特点 定义:生物素结合金纳米粒子,简称BtAu-NPs或biotin-conjugated Au-NPs,是指通过特定的化学反应或物理方法将生物素修饰到金纳米粒子表面,形成稳定的纳米复合材料。 特点: 高稳定性:生物素的修…...

LeetCode热题100刷题9:25. K 个一组翻转链表、101. 对称二叉树、543. 二叉树的直径、102. 二叉树的层序遍历
25. K 个一组翻转链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), nex…...

PyJWT,一个基于JSON的轻量级安全通信方式的python库
目录 什么是JWT? JWT的构成 PyJWT库简介 安装PyJWT 生成JWT 验证JWT 使用PyJWT的高级功能 自定义Claims 错误处理 结语 什么是JWT? 在介绍PyJWT这个Python库之前,我们首先需要了解什么是JWT。JWT,全称JSON Web Token&am…...

Golang | Leetcode Golang题解之第223题矩形面积
题目: 题解: func computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 int) int {area1 : (ax2 - ax1) * (ay2 - ay1)area2 : (bx2 - bx1) * (by2 - by1)overlapWidth : min(ax2, bx2) - max(ax1, bx1)overlapHeight : min(ay2, by2) - max(ay1, by1)…...

新手怎么使用GitLab?
GitLab新手指南: GitLab 是一个非常强大的版本控制和项目管理平台,对于新手来说,开始使用可能会有些许挑战,但只要跟着以下步骤,相信你就能很快上手。 1. 注册与登录 访问网站:打开浏览器,访问 GitLab官网…...

表情包原理
https://unicode.org/Public/emoji/12.1/emoji-zwj-sequences.txt emoji 编码规则介绍_emoji编码-CSDN博客 UTS #51: Unicode Emoji C UTF-8编解码-CSDN博客 创作不易,小小的支持一下吧!...

技术难点思考SpringBoot如何集成Jmeter开发
技术难点思考SpringBoot如何集成Jmeter开发 需求概述 构建一个高性能的压测平台,该平台需通过Spring Boot框架调用JMeter进行自动化压力测试。 解决方案一:使用Runtime类调用外部进程 技术概述 Java的Runtime类提供了与操作系统交互的接口࿰…...

如何快速使用C语言操作sqlite3
itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源,拥抱国产化 一、sqlite3库介绍 sqlite3库可从官网下载,当前版本为sqlite3 3.45.3ht…...

网络模型介绍
网络模型在网络领域中主要指的是用于描述计算机网络系统功能的各种框架,其中最具代表性的两种模型是OSI七层参考模型和TCP/IP四层参考模型。以下是对这两种网络模型的详细解析: 一、OSI七层参考模型 OSI(Open System Interconnection&#…...

Codeforces Round #956 (Div. 2) and ByteRace 2024
A题:Array Divisibility 思路: 大水题 code: inline void solve() {int n; cin >> n;for (int i 1; i < n; i ) {cout << i << " \n"[i n];}return; } B题:Corner Twist 思路࿱…...

域名、网页、HTTP概述
目录 域名 概念 域名空间结构 域名注册 网页 概念 网站 主页 域名 HTTP URL URN URI HTML 超链接 发布 HTML HTML的结构 静态网页 特点 动态网页 特点 Web HTTP HTTP方法 GET方法 POST方法 HTTP状态码 生产环境下常见的HTTP状态码 域名 概念 IP地…...

Redisson分布式锁、可重入锁
介绍Redisson 什么是 Redisson?来自于官网上的描述内容如下! Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了…...

适合宠物饮水机的光电传感器有哪些
如今,随着越来越多的人选择养宠物,宠物饮水机作为一种便捷的饮水解决方案日益受到欢迎。为了确保宠物随时能够获得足够的水源,宠物饮水机通常配备了先进的光电液位传感器技术。 光电液位传感器在宠物饮水机中起着关键作用,主要用…...

『Python学习笔记』Python运行设置PYTHONPATH环境变量!
Python运行设置PYTHONPATH环境变量! 文章目录 一. Python运行设置PYTHONPATH环境变量!1. 解释2. 为什么有用3. 示例4. vscode配置 一. Python运行设置PYTHONPATH环境变量! export PYTHONPATH$(pwd) 是一个命令,用于将当前目录添…...

2024年06月CCF-GESP编程能力等级认证Python编程三级真题解析
本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证…...

代码随想录算法训练营:20/60
非科班学习算法day20 | LeetCode235:二叉搜索树的最近公共祖先 ,Leetcode701:二叉树的插入操作 ,Leetcode450:删除二叉搜索树的节点 介绍 包含LC的两道题目,还有相应概念的补充。 相关图解和更多版本: 代码随想录 (programmer…...

Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata应用侧启动过程剖析——RM & TM如何与TC建立连接 前言 看过官网 README 的第…...

Origin 的使用
官网:OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 安装:Origin2022最新最详细的安装教程 学生免费:Origin 官方正版免费续期教程 更改语言:解决OriginPro2024学生版本的更改中文change language灰…...

MySQL相关知识点
目录 1. 基本概念2. 数据类型3. 数据库操作4. 表操作5. 数据操作6. 索引7. 约束8. 事务9. 存储过程和触发器10. 优化和性能调优11. 安全性12. 备份和恢复 MySQL 是一个广泛使用的 关系数据库管理系统 (RDBMS)。了解 MySQL 的主要知识点可以帮助你更好地设计、管理和优化数据库…...

第4章 Vite模块化与插件系统(二)
4.3 常用插件介绍 4.3.1 官方插件 vitejs/plugin-vue 用于支持 Vue.js 开发: npm install vitejs/plugin-vue --save-devimport vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue()] })vitejs/plugin-react 用于支持 React 开发…...

前端传到后端的data数组中有些属性值为空
将前端输入框中的值全部放入data中传入后端,但是在后端查看发现后端接收到的数据有些属性值为空。 第一种情况:只有第一个属性为空,其余属性接收正常 可能原因:后端用来接收的 比如前端发送数据: 实际上前端发送的数…...

怎么批量下载网页里的图片和视频 如何批量下载一个网站的所有图片 如何批量下载网页视频文件 idm软件怎么下载
当我们在网站内需要下载大量图片时,一张一张的下载非常麻烦。这里推荐大家使用IDM这款网页图片下载工具。下面,我将介绍怎么批量下载网页里的图片和视频,如何批量下载一个网站的所有图片的解决方法。 一、怎么批量下载网页里的图片和视频 …...

Python面试题:在 Python 中,如何处理文件操作?
在Python中,文件操作(如读取和写入文件)是一个常见的任务。Python标准库提供了内置的函数和上下文管理器来简化文件操作。以下是处理文件操作的一些基本方法和示例: 打开和关闭文件 使用open()函数打开文件。该函数返回一个文件…...