当前位置: 首页 > news >正文

《protobuf》基础语法2

文章目录

  • 枚举类型
  • ANY 类型
  • oneof 类型
  • map 类型
  • 改进通讯录实例

枚举类型

protobuf里有枚举类型,定义如下

enum PhoneType
{string home_addr = 0;string work_addr = 1;
}

message一样,可分为 嵌套定义,文件内定义,文件外定义。不过多演示

但是值得注意的点是

  1. 同级(同层)的枚举类型,各个枚举类型中的常量不能重名,否则编译会报错。如下:
enum A
{int32 a = 0;
}
enum B
{int32 a = 0;
}

A和B有相同的变量a,所以会报错

  1. 单个 .proto 文件下,最外层枚举类型和嵌套枚举类型,不算同级。如下:
enum A
{int32 a = 0;
}
message C
{enum B{int32 a = 0;}
}
  1. 多个 .proto 文件下,若一个文件引入了其他⽂件,且每个文件都未声明 package,每个 proto 文
    件中的枚举类型都在最外层,算同级。如下:
// 在 A.proto 文件里
import "B.proto"
enum A
{int32 a = 0;   // 报错,B.proto 里以及定义
}
-----------------------
// 在 B.proto 文件里
enum B
{int32 a = 0;
}
  1. 多个 .proto 文件下,若一个文件引入了其他文件,且每个文件都声明了 package,不算同级。如下
// 在 A.proto 文件里
import "B.proto"
package A;
enum A
{int32 a = 0;
}
-----------------------
// 在 B.proto 文件里
package B;
enum B
{int32 a = 0;
}

ANY 类型

介绍一下ANY类型,ANY类型表示任意类型

  • 头文件位置 /usr/local/protobuf/include/google/protobuf/
    在这里插入图片描述

如何将其引入 .proto 文件里

// 在/usr/local/protobuf/include
import "google/protobuf/any.proto";
// 使用
message Any{google.protobuf.Any data = 1;
}
  • 介绍常用函数:
// 已知信息如下
/ contacts.proto文件  //
syntax = "proto3"
package contacts;
import "google/protobuf/any.proto";  // 引入Any类型
message PeopleInfo
{// 可以用于任何类型的anygoogle.protobuf.Any data = 1;
}message Address
{string home_addr;
} test.cc文件 //
#include <iostream>
#include "contacts.pb.h"  // contacts.proto 编译后生成的头文件
using namespace std;int main()
{// 包装contact2::PeopleInfo people;contact2::Address addr;addr.set_home_addr("中国");google::protobuf::Any* any = people.mutable_data();  // 开辟一段any对象的空间any->PackFrom(addr);  // 将addr打包成Any类型// 转换contact2::Address addr2;if(people.has_data()){google::protobuf::Any any = people.data();  // 获取people里的Any类对象 if(any.Is<contact2::Address>()) // 判断any类型是否为 Address 类{any.UnpackTo(&addr2);  // 输出型参数,填充add2cout << addr2.home_addr() << endl;  // 打印}}return 0;
}

编译 .proto 文件,然后编译连接 test.cc 文件,执行结果如下:
在这里插入图片描述

执行大致流程
在这里插入图片描述
分类讲解一下常用函数:

  • 属于people对象的
    • Any* mutable_data(); ------- // 开辟一段 any 对象的空间
    • Any& data() const; ----------- // 获得 any 对象(即:people里的data)
    • bool has_data() const; ------- // 判断有无对 any 对象赋值
  • 属于 people 里 Any类型的data 对象的
    • bool PackFrom(const Message& message); -------- // 将任意类型转换成 Any 类
    • bool UnpackTo(Message* message) const; -------- // 将 any 对象里的值赋给相对应类型的对象
    • template< class T> bool Is() const; -------- // 判断是否为对应类型

oneof 类型

oneof 类型语法简单:

  • 定义如下
message PeopleInfo
{string name = 1;oneof gender{string male = 2;string female = 3;}
}

但是值得注意的点是

  • 可选字段中的字段编号,不能与非可选字段的编号冲突。
  • 不能在 oneof 中使用 repeated 字段。
  • 将来在设置 oneof 字段中值时,如果将 oneof 中的字段设置多个,那么只会保留最后⼀次设置的成员,之前设置的 oneof 成员会自动清除。

看看编译后的 .pb.h 文件里定义的内容

class PeopleInfo final :public ::PROTOBUF_NAMESPACE_ID::Message 
{enum GenderCase {kMale = 2,kFemale = 3,GENDER_NOT_SET = 0,};// string male = 2;bool has_male() const;void clear_male();const std::string& male() const;template <typename ArgT0 = const std::string&, typename... ArgT>void set_male(ArgT0&& arg0, ArgT... args);std::string* mutable_male();PROTOBUF_NODISCARD std::string* release_male();void set_allocated_male(std::string* male);// string female = 3;bool has_female() const;void clear_female();const std::string& female() const;template <typename ArgT0 = const std::string&, typename... ArgT>void set_female(ArgT0&& arg0, ArgT... args);std::string* mutable_female();PROTOBUF_NODISCARD std::string* release_female();void set_allocated_female(std::string* female);void clear_gender();GenderCase gender_case() const;
}

会将 oneof 中的多个字段定义为⼀个枚举类型。

  • 设置和获取:对 oneof 内的字段进⾏常规的设置和获取即可,但要注意只能设置⼀个。如果设置多个,那么只会保留最后⼀次设置的成员
  • 清空oneof字段:clear_ 方法
  • 获取当前设置了哪个字段:_case 方法
  • 设置值方法: set_
  • 判断该值是否存在方法:has_

map 类型

类似于C++里面的 map 类型,protobuf自己实现了一个类似的数据结构,protobuf 的 map 类型的实现是基于它的 Message 类型的。

  • 定义如下
message PeopleInfo
{map<string, string> info = 1;
}

但是值得注意的点是

repeated map< key_type, value_type> map_name = N;

  • key_type 是除了 float 和 byte 的其他任何标量类型。value_type 可以是任意类型
  • map 也不可以被 repeated 修饰
  • map 中存入的元素是无序

讲解一下几个相关常用函数

  • 在PeopleInfo对象里,一般用 mutable_info ( 这里的 info 是对应map类对象 info ) 来开辟一段空间,返回 map 指针来操控info。
    函数原型Map< std::string, std::string >*mutable_info()
  • void clear_info(); 清空对象里的内容。

此外,map还支持迭代器,和C++里的 unorderedmap 十分类似。

改进通讯录实例

运用上述知识点,对上一篇的通讯录代码进行增添功能

contacts.proto

syntax = "proto3";
package contact2;// 在/usr/local/protobuf/include
import "google/protobuf/any.proto";// 地址信息
message Address
{string home_addr = 1;string work_addr = 2;
}
// 个人信息
message PeopleInfo
{string name = 1;int32 age = 2;// 嵌套定义message Phone{string number = 1;// 嵌套枚举enum PhoneType{MP = 0;  // 移动电话TEL = 1; // 固定电话}PhoneType type = 2;}// repeated 修饰词 修饰的变量相当于数组repeated Phone phone = 3;google.protobuf.Any data = 4;// 其他联系方式oneof other_contacts{string QQ = 5;string Wechat = 6;}// 备注map<string, string> remark = 7;
}// 通讯录
message Contacts
{repeated PeopleInfo contacts = 1;
}

write.cpp
在这里插入图片描述

执行结果

在这里插入图片描述

read.cpp

在这里插入图片描述
在这里插入图片描述

相关文章:

《protobuf》基础语法2

文章目录 枚举类型ANY 类型oneof 类型map 类型改进通讯录实例 枚举类型 protobuf里有枚举类型&#xff0c;定义如下 enum PhoneType {string home_addr 0;string work_addr 1; }同message一样&#xff0c;可分为 嵌套定义&#xff0c;文件内定义&#xff0c;文件外定义。不…...

利用 SOAR 加快事件响应并加强网络安全

随着攻击面的扩大和攻击变得越来越复杂&#xff0c;与网络攻击者的斗争重担落在了安全运营中心 &#xff08;SOC&#xff09; 身上。SOC 可以通过利用安全编排、自动化和响应 &#xff08;SOAR&#xff09; 平台来加强组织的安全态势。这一系列兼容的以安全为中心的软件可加快事…...

uni-app:通过ECharts实现数据可视化-如何引入项目

效果 引入文件位置 代码 <template><view id"myChart"></view> </template> <script> import echarts from /static/js/echarts.js // 引入文件 export default {mounted() {// 初始化EChartsconst myChart echarts.init(document…...

string 模拟与用法

string 用法 string string 模拟 #pragma once #include <assert.h> #include <string.h> #include <iostream>namespace sjy {class string{public://迭代器相关typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _st…...

[NLP] LLM---<训练中文LLama2(一)>训练一个中文LLama2的步骤

一 数据集 【Awesome-Chinese-LLM中文数据集】 【awesome-instruction-dataset】【awesome-instruction-datasets】【LLaMA-Efficient-Tuning-数据集】Wiki中文百科&#xff08;25w词条&#xff09;wikipedia-cn-20230720-filteredBaiduBaiKe&#xff08;563w词条&#xff09; …...

华为云云耀云服务器L实例使用教学 | 利用华为云服务器搭建--> 基于Spring Boot+WebSocket+WebRtc实现的多人自习室

文章目录 1. 购买华为云服务器L2. 在华为云服务器上搭建项目前期准备工作1. 更换登录密码2. 安全组配置 3. 在服务器上运行自己的项目 1. 购买华为云服务器L 在有优惠券的情况下&#xff0c;来到华为云这个网址下面&#xff0c;链接为&#xff1a;https://www.huaweicloud.com…...

Postman应用——接口请求(Get和Post请求)

文章目录 新增请求接口请求Get接口请求Post 这里只讲用的比较多的Get和Post请求方式&#xff0c;也可以遵循restful api接口规范&#xff0c;使用其他请求方式。 GET&#xff08;SELECT&#xff09;&#xff1a;从服务器取出资源&#xff08;一项或多项&#xff09;POST&#…...

k8s pod概念、分类及策略

目录 一.pod相关概念 &#xff12;.Kubrenetes集群中Pod两种使用方式 &#xff13;.pause容器的Pod中的所有容器共享的资源 &#xff14;.kubernetes中的pause容器主要为每个容器提供功能&#xff1a; &#xff16;.Pod分为两类&#xff1a; 二.Pod容器的分类 1.基础容器…...

C++系列-左移运算符重载

左移运算符重载 左移运算符的应用左移运算符的重载 左移运算符的应用 左移运算符&#xff0c;左移第一个操作数的位&#xff0c;第二个操作数决定要移动的位置左移运算符还可以用于输出调试&#xff0c;cout << “Hello” << endl; 左移运算符的重载 左移运算符…...

【Vue】vue中v-if的用法

v-if是Vue.js中常用的条件渲染指令&#xff0c;根据表达式的值来动态控制元素的显示或隐藏。具体的使用方法如下&#xff1a; 1.基本语法 <div v-if"condition"><!-- content --> </div>其中&#xff0c;v-if后面跟着一个表达式condition&#x…...

企业架构LNMP学习笔记54

企业架构NoSQL数据库之MongoDB。 学习目标和内容&#xff1a; 1&#xff09;能够简单描述mongoDB的使用特点&#xff1a; 2&#xff09;能够安装配置启动MongoDB&#xff1b; 3&#xff09;能够使用命令行客户端简单操作MongoDB&#xff1b; 4&#xff09;能够实现基本的数…...

C【函数】

1.常用API 1.strcpy&#xff1a;#include<string.h> char * strcpy ( char * destination, const char * source );int main(){char arr1[] "bit";char arr2[20] "###########";// bit\0########strcpy(arr2, arr1);printf("…...

【简单教程】利用Net2FTP构建免费个人网盘,实现便捷的文件管理

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…...

05-Flask-Flask查询路由方式

Flask查询路由方式 前言命令行方式代码实现返回所有路由 前言 本篇来学习下Flask中查询路由的方式 命令行方式 # window 用set linux 用 export set FLASK_APPtest_6_flask运行发方式# 打印所有路由 flask routes代码实现返回所有路由 # -*- coding: utf-8 -*- # Time …...

lua环境搭建数据类型

lua作为一门计算机语言&#xff0c;从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。 1.首先我们需要下载lua开发工具包 在这里我们使用的工具是luadist 下载链接为&#xff1a;https://luadist.org/repository/下载后的压缩包解压后就能用。 2.接下来就是老生…...

c++11的一些新特性

c11 1. {}初始化2. 范围for循环3. final与override4. 右值引用4.1 左值引用和右值引用4.2 左值引用与右值引用比较 5. lambda表达式6. 声明6.1 auto6.2 decltype6.3 nullptr 7. 可变参数模版 1. {}初始化 在C中&#xff0c;使用花括号初始化的方式被称为列表初始化。列表初始化…...

K8S名称空间和资源配额

Kubernetes 支持多个虚拟集群&#xff0c;底层依赖于同一个物理集群。 这些虚拟集群被称为名称空间。名称空间namespace是k8s集群级别的资源&#xff0c;可以给不同的用户、租户、环境或项目创建对应的名称空间&#xff0c;例如&#xff0c;可以为test、dev、prod环境分别创建各…...

鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决

目录 问题解决思路解决代码&#xff08;标注【主要代码】的为重点&#xff09; 问题 拖动该悬浮球时&#xff0c;鼠标弹起可能会触发悬浮球内事件 解决思路 鼠标拖动盒子时&#xff0c;将 isMove 设为 true 意为正在拖动盒子&#xff0c;此时将 class"btns_move" 遮…...

PMP项目管理证书是什么?有什么用?

什么是PMP证书&#xff1f; PMP全称是Project Management Professional&#xff0c;中文全称叫项目管理专业人士资格认证&#xff0c;是由美国项目管理协会(PMI)发起&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试&#xff0c;目的是为了给项目管理人…...

iframe的父子通讯

最近有个需求是在父页面打开一个弹窗&#xff0c;然后弹窗里面是一个iframe&#xff0c;在关闭弹窗时需要把iframe中的audio标签的音频链接清空和做一些其他的操作。因为以前很少接触iframe&#xff0c;所以对它有点陌生&#xff0c;在经过大佬的指点和上网查阅后找到了解决方法…...

5V与3.3V MCU串口电平转换电路设计

不同工作电压MCU间的串口电平转换电路设计1. 项目概述1.1 问题背景在现代嵌入式系统设计中&#xff0c;经常遇到不同工作电压的微控制器(MCU)之间需要进行串口通信的场景。例如&#xff1a;MCU1工作电压&#xff1a;5VMCU2工作电压&#xff1a;3.3V若直接将两个MCU的TX、RX引脚…...

直流GIL绝缘子表面电荷积聚的电热耦合机理与电场畸变特性研究

中国电机工程学报文献复现 关于comsol GIL仿真模型&#xff1a;基于电热多物理场耦合模型的直流GIL 绝缘子表面电荷积聚及其对沿面电场影响的研究上周啃完那篇中国电机工程学报的直流GIL绝缘子仿真论文&#xff0c;本来以为照着公式套就能搞定&#xff0c;结果在Comsol里卡了整…...

ArduPilot电机控制逻辑与PWM输出机制剖析

1. ArduPilot电机控制基础概念 当你第一次接触无人机飞控时&#xff0c;最让人困惑的莫过于电机控制逻辑了。想象一下&#xff0c;你手里拿着遥控器&#xff0c;轻轻推动摇杆&#xff0c;无人机就能平稳地上升、下降或者转向。这背后到底发生了什么&#xff1f;让我用最直白的…...

别再只开会了!解锁Jitsi隐藏玩法:用Freeswitch+Jigasi打造智能电话会议IVR

解锁Jitsi企业级应用&#xff1a;用FreeswitchJigasi构建智能会议IVR系统 当视频会议成为企业刚需&#xff0c;大多数团队仍停留在基础会议功能层面。开源工具Jitsi与电信级软交换平台Freeswitch的结合&#xff0c;能创造出远超常规会议体验的智能交互系统。想象一下这样的场景…...

开源编解码工具技术选型与实战指南:跨场景应用的H.264解决方案

开源编解码工具技术选型与实战指南&#xff1a;跨场景应用的H.264解决方案 【免费下载链接】openh264 Open Source H.264 Codec 项目地址: https://gitcode.com/gh_mirrors/op/openh264 一、价值定位&#xff1a;为什么开源编解码工具是技术选型的最优解 在视频技术快…...

Word自动编号的隐藏玩法:用题注和交叉引用,打造能“自我修复”的智能文档

Word文档工程化&#xff1a;构建自动编号与交叉引用的智能系统 在技术文档撰写过程中&#xff0c;最令人头疼的莫过于图表编号的维护。当你在200页的文档中插入新图表时&#xff0c;手动编号意味着要逐个修改后续所有编号和引用——这种痛苦只有经历过的人才懂。但很少有人意识…...

告别WoMic:用VB-Audio Virtual Cable和TCP Socket自建无线麦克风(含参数配置避坑指南)

无线音频传输方案重构&#xff1a;VB-Audio与TCP Socket的工程实践 在音频处理领域&#xff0c;虚拟麦克风技术一直是个既实用又有趣的话题。许多开发者最初接触这一领域是通过WoMic这样的解决方案&#xff0c;但随着项目复杂度提升&#xff0c;人们往往需要更灵活、更可控的自…...

麦橘超然Flux效果展示:多风格AI绘画作品集锦

麦橘超然Flux效果展示&#xff1a;多风格AI绘画作品集锦 1. 惊艳开篇&#xff1a;当AI画笔遇见专业级表现 在数字艺术创作领域&#xff0c;我们常常面临一个两难选择&#xff1a;要么使用云端AI服务但受限于网络和隐私&#xff0c;要么部署本地工具却要忍受复杂的配置和显存焦…...

分布式电池管理系统:基于微控制器架构的智能电池保护与均衡解决方案

分布式电池管理系统&#xff1a;基于微控制器架构的智能电池保护与均衡解决方案 【免费下载链接】SmartBMS Open source Smart Battery Management System 项目地址: https://gitcode.com/gh_mirrors/smar/SmartBMS SmartBMS是一个开源的智能电池管理系统&#xff0c;专…...

分子构象采样新范式:CREST工具解决药物研发核心挑战

分子构象采样新范式&#xff1a;CREST工具解决药物研发核心挑战 【免费下载链接】crest Conformer-Rotamer Ensemble Sampling Tool based on the xtb Semiempirical Extended Tight-Binding Program Package 项目地址: https://gitcode.com/gh_mirrors/crest/crest 在药…...