protobuf简单使用(二)

news2024/10/2 20:30:09

介绍

上一节中,我们介绍了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://www.coloradmin.cn/o/1471851.html

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

相关文章

matplotlib plt.show()却弹出空白框并之后自动退出程序的原因及解决方法

运行下列代码并使用plt.show()进行展示时候&#xff0c;cmd输出如下&#xff1a; 先弹出空白框&#xff1a; 而后直接退出程序&#xff1a; 之前遇到过很多次&#xff0c;由于不输出Traceback&#xff0c;完全不知道什么原因。结果发现是因为没有导入torch导致的。 解决办法就…

电商平台商品详情api数据一键采集

批量采集电商平台商品详情API数据的步骤如下&#xff1a; 1. 了解目标电商平台&#xff1a;首先&#xff0c;你需要了解目标电商平台的API文档和规则。不同的电商平台可能有不同的API接口和限制&#xff0c;需要熟悉这些信息。 2. 获取API访问权限&#xff1a;在采集数据之前…

【C++】类与对象——友元,内部类,匿名对象

类与对象 1 友元1.1 概念&#xff1a;1.2 友元函数1.3 友元类 2 内部类概念&#xff1a;特性&#xff1a;举例&#xff1a; 3 匿名对象Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&am…

基于Java的艺培管理解决方案

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Canvas动画之豌豆射手

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

多线程基础说明【基础篇】

目录 &#x1f32d;1.相关概念 &#x1f37f;2.创建和启动线程 &#x1f95e;3.线程安全 &#x1f9c8;4.死锁 &#x1f953;5.线程通信的方法 1.相关概念 1.1程序 为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象…

Flask基础学习3

参考视频&#xff1a;41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码&#xff08;登录QQ邮箱的授权码总是断开收不到邮件&#xff09;&#xff0c; # config # config mail MAI…

vue3 实现 el-pagination页面分页组件的封装以及调用

示例图 一、组件代码 <template><el-config-provider :locale"zhCn"><el-pagination background class"lj-paging" layout"prev, pager, next, jumper" :pager-count"5" :total"total":current-page"p…

LeetCode二叉树中的第 K 大层和

题目描述 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。 注意&#xff0c;如果两个节点与根节点的距离相同&#xff0c;则…

SocketWeb实现小小聊天室

SocketWeb实现小小聊天室 消息推送的常见方式轮询长轮询SSE&#xff08;server-sent event&#xff09;&#xff1a;服务器发送事件WebSocketWebSocket简介WebSocket API 实现小小聊天室实现流程消息格式客户端-->服务端服务端-->客户端 消息推送的常见方式 轮询 浏览器…

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

远程连接Redis

以连接阿里云上的Redis为例 1. 在阿里云安全组中开放端口 2.修改Redis启动时所用的配置文件&#xff08;redis.conf&#xff09; 2.1 修改ip地址 如图&#xff1a;将默认的本地ip bind 127.0.0.1地址改为bind 0.0.0.0 2.2 将保护模式关闭 将默认的 supervised yes 改为 n…

Docker基础(一)

文章目录 1. 基础概念2. 安装docker3. docker常用命令3.1 帮助命令3.2 镜像命令3.3 容器命令3.4 其他命令 4. 使用案例 1. 基础概念 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官…

Java Web(八)--Servlet(一)

介绍 官网&#xff1a;Servlet 3.1 API Documentation - Apache Tomcat 8.0.53 为什么需要&#xff1f; 提出需求: 请用你现有的html css javascript&#xff0c;开发网站&#xff0c;比如可以让用户留言/购物/支付? 引入我们动态网页(能和用户交互)技术>Servlet 是什…

医院LIS(全称Laboratory Information Management System)系统源码

目录 一、医院LIS系统概况 二、医院LIS系统建设必要性 三、为什么要使用LIS系统 四、技术框架 &#xff08;1&#xff09;总体框架 &#xff08;2&#xff09;技术细节 &#xff08;3&#xff09;LIS主要功能模块 五、LIS系统优势 &#xff08;1&#xff09;客户/用户…

【Python】记录生产编程小tips(字符串处理、列表删除、字典、csv、excel操作)持续更新

文章目录 一.for循环删除列表元素1.删除list元素方法2.直接删除往往结果与期望不一致3.循环删除元素的正确方法&#xff1a;方法1&#xff1a;while循环i减方法2&#xff1a;使用copy方法3&#xff1a;倒叙遍历 二.字符串处理库三.字典—dict运用四.csv操作五.excel操作1.读exc…

AI:139-基于深度学习的语音指令识别与执行

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

改进 RAG:自查询检索

原文地址&#xff1a;Improving RAG: Self Querying Retrieval 2024 年 2 月 11 日 让我们来解决构建 RAG 系统时的一个大问题。 我们不能依赖语义搜索来完成每个检索任务。只有当我们追求单词的含义和意图时&#xff0c;语义搜索才有意义。 But in case&#xff0c;我们正…

python自动化管理和zabbix监控网络设备(有线网络和路由配置部分)

目录 目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 六、FW1 七、DMZ-SW1 结语 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name…

选择稳定代理IP需要考虑哪些因素?

很多人不知道怎么选择稳定的代理IP&#xff0c;也不知道当前代理IP套餐是否稳定&#xff0c;今天我们一起来分析下&#xff0c;选择稳定的代理IP可以从哪几方面去考虑。 1、代理IP的可用性 代理IP要稳定&#xff0c;先要可以用。一个代理IP池是否稳定&#xff0c;要看代理IP的…