[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 常用数据结构命令服务,还提供了…...
适合宠物饮水机的光电传感器有哪些
如今,随着越来越多的人选择养宠物,宠物饮水机作为一种便捷的饮水解决方案日益受到欢迎。为了确保宠物随时能够获得足够的水源,宠物饮水机通常配备了先进的光电液位传感器技术。 光电液位传感器在宠物饮水机中起着关键作用,主要用…...
PyQt5实战:手把手教你打造PPT风格的颜色+线型组合下拉框(附完整源码)
PyQt5高级控件开发:打造Office风格的颜色与线型组合选择器 在桌面应用开发中,提供直观、专业的样式选择控件是提升用户体验的关键。本文将深入探讨如何利用PyQt5构建一个功能完备的Office风格组合选择器,集成颜色选择、线型设置和粗细调整等核…...
使用Typora与Qwen3.5-4B打造智能写作工作流:大纲生成与文稿润色
使用Typora与Qwen3.5-4B打造智能写作工作流:大纲生成与文稿润色 1. 写作痛点与解决方案 对于内容创作者和技术文档工程师来说,Markdown写作过程中常遇到三个核心问题:一是从零开始构思文章大纲耗时费力;二是反复检查语法和风格一…...
跨平台开源工具OptiScaler:释放显卡潜能的性能优化指南
跨平台开源工具OptiScaler:释放显卡潜能的性能优化指南 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler 你是否曾因显卡…...
可视化拖拽组件库终极指南:响应式设计与适配方案完整解析
可视化拖拽组件库终极指南:响应式设计与适配方案完整解析 【免费下载链接】visual-drag-demo 一个低代码(可视化拖拽)教学项目 项目地址: https://gitcode.com/gh_mirrors/vi/visual-drag-demo 可视化拖拽组件库是现代低代码开发平台的…...
RePKG开发者指南:深入理解C逆向工程实现原理
RePKG开发者指南:深入理解C#逆向工程实现原理 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款强大的 Wallpaper Engine PKG文件提取与TEX图像转换工具&#…...
突破微信设备限制:WeChatPad如何实现免Root双设备同时在线
突破微信设备限制:WeChatPad如何实现免Root双设备同时在线 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 你是否曾因微信只能单设备登录而错失重要消息?是否渴望在手机和平板上同时接…...
Marin说PCB之GMSL2 POC电路优化实战---从仿真到测试的完整解析
1. GMSL2 POC电路问题诊断与优化思路 最近在测试GMSL2 POC电路时遇到了一个典型问题:多路信号的插损(S21)和回损(S11)指标不达标。这种情况在实际项目中并不少见,但每次遇到都需要我们仔细分析原因并找到有…...
nli-distilroberta-base在内容聚合平台中的落地:多源新闻事件一致性交叉验证
nli-distilroberta-base在内容聚合平台中的落地:多源新闻事件一致性交叉验证 1. 项目背景与价值 在信息爆炸的时代,内容聚合平台每天需要处理来自不同来源的海量新闻资讯。如何快速验证同一事件在不同报道中的一致性,成为平台内容质量管控的…...
Alt App Installer:打破微软商店限制的Windows应用自由安装方案
Alt App Installer:打破微软商店限制的Windows应用自由安装方案 【免费下载链接】alt-app-installer A Program To Download And Install Microsoft Store Apps Without Store 项目地址: https://gitcode.com/gh_mirrors/alt/alt-app-installer 你是否曾经因…...
嵌入式Linux实战:全志T3+vsftpd实现轻量级文件传输(含WinSCP连接教程)
嵌入式Linux实战:全志T3vsftpd实现轻量级文件传输(含WinSCP连接教程) 在物联网设备开发中,文件传输是一个看似简单却充满挑战的环节。当你的开发板是全志T3这样的资源受限平台时,如何在有限的存储和内存条件下搭建一个…...
