protobuf简单使用(二)

介绍

上一节中,我们介绍了protobuf,简单来说,它是一种消息数据格式,其作用类似于json,但是比json的使用效率要高。

除此以外,我们介绍了protobuf的简单使用,也就是如何可以像使用json一样,将消息数据进行序列化和反序列化

nullicon-default.png?t=N7T8https://blog.csdn.net/qq_58158950/article/details/136277730?spm=1001.2014.3001.5501但是在日常开发中,除了我们在上节中会使用到的普通数据之外,我们还会用到列表(数组)类型和映射表类型的数据,本节我们将介绍如何使用protobuf对列表类型的数据进行序列化和反序列化

使用

protobuf中的代码复用

仍旧首先编写protobuf配置文件

在上一节中,我们定义登录响应消息类型的时候有两个成员变量errcode和errmasg,这两个成员变量的作用就是来告诉客户端我们发送给服务端的请求是否出错以及出错信息。

message loginResponse
{int32 errcode=1;string errmsg=2;bool success=3;
}

因此作为响应消息,这两个成员变量是必须的,比如我们如果要定义一个注册请求消息

message regResponse
{int32 errcode=1;string errmsg=2;bool success=3;
}

显然,这种定义方式不符合代码的复用,因此,我们完全可以将这两个成员变量单独拿出来定义一个类型

//封装响应消息
message resultCode
{int32 errcode=1;bytes errmsg=2;
}

那么登录响应消息就变成了

//登录响应消息
message loginResponse
{resultCode resMsg=1;bool success=3;
}

而在c++代码中,我们想要使用loginResponse类的resultCode 成员变量时,就需要这样写

void test()
{loginResponse reqb;//获取resultCode成员对象的指针,然后再通过该指针设置成员变量//该指针的获取方法是mutable_成员变量名称resultCode*rc= reqb.mutable_resmsg();rc->set_errcode(1);rc->set_errmsg("登录处理失效");
}

protobuf中的列表数据类型

接下来我们介绍protobuf中列表数据类型

我们继上述配置文件代码,再定义一个user消息类型,其中性别成员变量是一个枚举类型

//用户消息
message user
{bytes name=1;uint32 age=2;enum sex{man=0;woman=1;}
}

我们再定义一个好友列表请求和好友列表响应消息

//好友列表请求
message friendListReq
{int32 userid=1;
}//好友列表请求响应
message friendListResponse
{resultCode resMsg=1;// repeated关键字表示该消息是一个列表,而不是单个消息repeated user friendList=2;
}

由于好友列表响应返回的消息中,好友不会只有一个,因此需要返回一个user列表(数组),我们使用repeated关键字进行说明 

完整的protobuf配置文件如下

syntax="proto3";//声明protobuf版本
package rpcProto;//声明了代码所在的命名空间//定义登录请求消息类型
message loginRequest
{bytes name=1;//表示loginRequest消息的第一个字段bytes passwd=2;//表示loginRequest消息的第二个字段
}//封装响应消息
message resultCode
{int32 errcode=1;bytes errmsg=2;
}//登录响应消息
message loginResponse
{resultCode resMsg=1;bool success=3;
}//用户消息
message User
{bytes name=1;uint32 age=2;enum Sex{man=0;woman=1;}Sex sex=3;
}//好友列表请求
message friendListReq
{int32 userid=1;
}//好友列表请求响应
message friendListResponse
{resultCode resMsg=1;// repeated关键字表示该消息是一个列表,而不是单个消息repeated User friendList=2;
}

在终端输入以下代码生成对应的类文件

protoc test.proto --cpp_out=./

在c++代码中测试

#include<iostream>
#include<string>
#include<test.pb.h>
using namespace std;
using namespace rpcProto;void test()
{friendListResponse fres;resultCode* pc=fres.mutable_resmsg();pc->set_errcode(0);pc->set_errmsg("请求无错");// 使用add_列表变量名获取列表消息指针User *user1=fres.add_friendlist();user1->set_name("zhangsan");user1->set_age(20);user1->set_sex(User::man);User *user2=fres.add_friendlist();user2->set_name("lisi");user2->set_age(22);user2->set_sex(User::woman);cout<<fres.friendlist_size()<<endl;}int main()
{test();return 0;
}

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

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

相关文章

Springboot+vue的社区医疗综合服务平台(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区医疗综合服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区医疗综合服务平台&#xff0c;采用M&#xff08;m…

五、数组——Java基础篇

六、数组 1、数组元素的遍历 1.1数组的遍历&#xff1a;将数组内的元素展现出来 1、普通for遍历&#xff1a;根据下表获取数组内的元素 2、增强for遍历&#xff1a; for&#xff08;数据元素类型 变量名&#xff1a;数组名&#xff09;{ 变量名&#xff1a;数组内的每一个值…

面试经典150题【21-30】

文章目录 面试经典150题【21-30】6.Z字形变换28.找出字符串中第一个匹配项的下标68.文本左右对齐392.判断子序列167.两数之和11.盛最多水的容器15.三数之和209.长度最小的子数组3.无重复字符的最长子串30.串联所有单词的子串 面试经典150题【21-30】 6.Z字形变换 对于“LEETC…

【Java多线程】对线程池的理解并模拟实现线程池

目录 1、池 1.1、线程池 2、ThreadPoolExecutor 线程池类 3、Executors 工厂类 4、模拟实现线程池 1、池 “池”这个概念见到非常多&#xff0c;例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是&#xff1a;&#xff08;提高效率&#xff09; 1…

计网day5

六 传输层 6.1 传输层概述 6.2 UDP协议 6.3 TCP协议 TCP连接管理&#xff1a; TCP可靠传输&#xff1a; TCP拥塞控制&#xff1a;

[ROS 系列学习教程] rosbag 命令行介绍

ROS 系列学习教程(总目录) 本文目录 rosbag 命令行1.1 rosbag check1.2 rosbag compress1.3 rosbag decompress1.4 rosbag filter1.5 rosbag fix1.6 rosbag info1.7 rosbag play1.8 rosbag record1.9 rosbag reindex 有时我们需要将 topic 中的数据保存下来以便后面分析&#x…

istio实战:springboot项目在istio中服务调用

目录 一、前言二、准备工作三、问题排查四、总结参考资料 一、前言 在经过前面几天k8s和Istio的安装之后&#xff0c;开始进入最核心的阶段。微服务在抛弃传统的服务注册和服务发现之后&#xff0c;是怎么在istio怎么做服务间的调用的呢&#xff1f;本次实战花费了我2-3天的时…

【监控】grafana图表使用快速上手

目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中&#xff0c;我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…

Seata分布式事务实战AT模式

目录 分布式事务简介 典型的分布式事务应用场景 两阶段提交协议(2PC) 2PC存在的问题 什么是Seata&#xff1f; Seata的三大角色 Seata AT模式的设计思路 一阶段 二阶段 Seata快速开始 Seata Server&#xff08;TC&#xff09;环境搭建 db存储模式Nacos(注册&配…

vue3个人网站电子宠物

预览 具体代码 Attack.gif Attacked.gif Static.gif Walk.gif <template><div class"pet-container" ref"petContainer"><p class"pet-msg">{{ pet.msg }}</p><img ref"petRef" click"debounce(attc…

LemonSqueezy

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-08 11:22 CST Nmap scan report for 192.168.1.1 Host is up (0.00037s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan r…

论文精读--GPT3

不像GPT2一样追求zero-shot&#xff0c;而换成了few-shot Abstract Recent work has demonstrated substantial gains on many NLP tasks and benchmarks by pre-training on a large corpus of text followed by fine-tuning on a specific task. While typically task-agnos…

基于springboot+vue的校园社团信息管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

306_C++_QT_创建多个tag页面,使用QMdiArea容器控件,每个页面都是一个新的表格[或者其他]页面

程序目的是可以打开多个styles文件(int后缀文件),且是tag样式的(就是可以切多个页面出来,并且能够单独关闭);其中读取ini文件,将其插入到表格中的操作,也是比较复杂的,因为需要保持RGB字符串和前面的说明字符串对齐 ini文件举例: [MainMenu] Foreground\Selected=&…

栈和队列笔试题

答案&#xff1a;&#xff08;1&#xff09;seqn[tail]data; tail(tail1)%SEQLEN; &#xff08;2&#xff09;data seqn[head]; head (head1)%SEQLEN; &#xff08;3&#xff09;head tail; &#xff08;4&#xff09;(tail1)%SEQLEN head; (5) while(head!tail) head (h…

【北京迅为】《iTOP-3588开发板快速测试手册》第三章 Buildroot系统功能测试

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

导图解文 从梦想到财富(43)只要会请客吃饭,你就能设计出好产品

系列文章说明&#xff1a; 本系列文章 主要是 使用 ​​​​​​​思维导图 对知乎 上一个知乎上的专题系列文章《从梦想到财富》的 一个解读。 1 文章链接 本章节 对应 《从梦想到财富》专栏的 文章链接为&#xff1a;只要会请客吃饭&#xff0c;你就能设计出好产品 2 导图…

linux 0.11 调试c代码

我们可以通过实验楼实验环境 来调试linux0.11的c代码。 cd ~/oslab/ tar -zxvf hit-oslab-linux-20110823.tar.gz -C ~ cd ~/oslab/linux-0.11/ make cd ~/oslab/ nohup ./dbg-c & nohup terminator & ls在新的窗口执行 ./rungdb,进入调试状态。 输入 set disassemb…

打印水仙花数---c语言刷题

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 题述 求出0&#xff5e;100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#…

代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II, 131.分割回文串[回溯篇]

代码随想录算法训练营第二十六天 LeetCode 39. 组合总和题目描述思路参考代码总结 LeetCode 40.组合总和II题目描述思路参考代码 LeetCode 131.分割回文串题目描述思路切割问题回文判断 参考代码总结 LeetCode 39. 组合总和 题目链接&#xff1a;39. 组合总和 文章讲解&#xf…