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://www.mfbz.cn/a/408871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI游戏初创公司“奇酷网络”,获得500万元天使投资

发布 | 大力财经 2024年新春伊始的2月25日&#xff0c;国内首家“AI游戏”应用公司“奇酷网络”正式对外宣布&#xff1a;以3,000万元人民币的估值&#xff0c;成功获得500万元人民币的融资&#xff1b;资金来源于一名百度高层和一位知名的天使投资人。 据悉&#xff0c;“奇…

进程 2月24日学习笔记

1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xff09; PID:唯一识…

namecheap域名如何购买?通过支付宝(详细图文教程)

引言 在完成博客搭建的时候&#xff0c;我们可能需要一个好的域名&#xff0c;自己看起来才会舒服点&#xff0c;同时也可以通过google或者百度等方式搜索到自己博客。 经过实验发现&#xff0c;一个好的后缀名会增强google和百度的搜索seo&#xff0c;增加自己博客的流量。 …

平头哥IP核C906的JTAG调试器DIY教程(一)

背景 最近买了一块基于平头哥C906核&#xff0c;SOC为全志的D1s&#xff0c;的核心板&#xff0c;手工焊接在白嫖的底板上&#xff08;此处感谢百问网老师的友情支持&#xff0c;手动狗头&#xff09;。在焊接完成后&#xff0c;进行点亮跑程序的时候&#xff0c;发现没有优雅…

C++ //练习 8.13 重写本节的电话号码程序,从一个命名文件而非cin读取数据。

C Primer&#xff08;第5版&#xff09; 练习 8.13 练习 8.13 重写本节的电话号码程序&#xff0c;从一个命名文件而非cin读取数据。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***************************************…

关于设备连接有人云的使用及modbus rtu协议,服务器端TCP调试设置

有人云调试 调试过程问题1. 关于modbus rtu协议,实质上有三种modbus基本原理modbus 格式2. 关于modbus crc16通信校验3. 关于在ubuntu阿里云服务器端,监听网络数据之调试mNetAssist4. 使用有人FAE传给的设置软件问题???之前的一个项目,再拿出来回顾下。 调试过程 先 要在有…

web安全学习笔记【16】——信息打点(6)

信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等[1] #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-C…

特征选择|一种提升预测模型性能的方法(原理及其优化实现,Matlab)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 如今&#xff0c;生成的数据集呈指数级增长&#xff0c;这将产生具有大量特征和样本的数据集&#xff0c;而显然&#xff0c;某些特征是不相关/冗余的&#xff0c;它们…

奇异递归模板模式应用6-类模板enable_shared_from_this

异步编程中存在一种场景&#xff0c;需要在类中将该类的对象注册到某个回调类或函数中&#xff0c;不能简单地将this传递给回调类中&#xff0c;很可能因为回调时该对象不存在而导致野指针访问&#xff08;也有可能在析构函数解注册时被回调&#xff0c;造成对象不完整&#xf…

【C语言基础】:操作符详解(一)

文章目录 操作符详解1. 操作符的分类2. 二进制和进制转换2.1 什么是二进制、八进制、十进制、十六进制2.1.1 二进制和进制转换2.1.2 二进制转十进制2.2.3 二进制转八进制2.2.4 二进制转十六进制 3. 源码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&…

IT廉连看——C语言——函数

IT廉连看——C语言——函数 一、函数是什么&#xff1f; 数学中我们常见到函数的概念。但是你了解C语言中的函数吗&#xff1f; 维基百科中对函数的定义&#xff1a;子程序 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, …

【Java】java异常处理机制(实验五)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 1、理解java的异常处理机制 2、掌握try catch结构和thow和thows关键字的用法 二、实验内容 1、编写一个程序&#xff0c;输入某个班某门课程成绩&#xff0c;统计及格人数、不及格人数及课程平均分。设计一个异…

H12-821_59

59.R1、R2、R3、R4运行IS-IS,它们接口的DIS Priority如图所示,假如设备同时启动,则()被选举为D1S.(请填写设备名称、例如R1) 答案&#xff1a;R4 注释&#xff1a; IS-IS中DIS的选举支持抢占。 假设题目说R4最后启动&#xff0c;问谁被选举为DIS&#xff0c;答案仍然是R4。

【嵌入式实践】【芝麻】【设计篇-1】从0到1给电动车添加指纹锁:项目设计思路

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

NVIDIA Workbench 安装使用图文教程

NVIDIA Workbench 安装使用教程 文章目录 NVIDIA Workbench 安装使用教程1.安装1.1 下载软件1.2 安装软件 2.使用NVIDIA Workbench2.1 创建一个新项目 3.额外提示3.1 当我们没有停止直接关闭或者直接重启电脑后, 再打开我们已经创立的项目的时候可能会出现创建失败等错误信息.3…

Java核心-核心类与API(3)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;这次介绍一下枚举类以及与系统、交互有关的类&#xff0c;需要了解并能使用即可。 一、枚举类 1、概述 枚举也称穷举&#xff0c;简单理解就是把所有可能一一列举出来&#xff08;穷尽所有可能&#xff09;。枚举是一…

申请攻读博士学位研究生相关模板资料(包括专家推荐信、学术简历、研究计划及范文、回复导师邮件)

申请攻读博士学位研究生相关模板资料&#xff08;包括专家推荐信、学术简历、研究计划及范文、回复导师邮件&#xff09; 博士是对攻读博士学位的研究生的称呼&#xff0c;同样也可用来称呼已获得博士学位的人员。 主要通过拥有博士点的普通高等学校和拥有博士研究生培养资格…

[SUCTF 2019]EasySQL1 题目分析与详解

一、题目介绍 1、题目来源&#xff1a; BUUCTF网站&#xff0c;网址&#xff1a;https://buuoj.cn/challenges 2、题目描述&#xff1a; 通过以上信息&#xff0c;拿到flag。 二、解题思路 首先打开靶机&#xff0c;尝试输入1查看回显&#xff0c;回显如图所示&#xff1a;…

图像读取裁剪与人脸识别

图像读取 Image read ⇒ \Rightarrow ⇒ torchvision.datasets from torchvision import datasets dataset datasets.ImageFolder(data_dir, transformtransforms.Resize((512, 512)))Return value illustration dataset[0][0]是PIL.Image objects&#xff0c;这利用IPyth…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…