rpc中常用的数据格式:Protobuf 图文详解

概述

protobuf也叫protocol buffer,是google 的一种数据交换的格式,它跨语言、跨平台。可以实现多种语言文件的数据传输实现(java、c#、c++、go 和 python 等),如一个cpp程序和一个python程序的数据传输。

由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。所以它的效率和兼容性都很优秀,可以把它用于分布式应用之间的数据通信。

编译与安装

通过百度网盘分享的文件:proto
链接:https://pan.baidu.com/s/1o7Vmcyofz6r_phLdh-A2lA?pwd=t172 
提取码:t172

解压后运行shell脚本即可

编写简单的proto文件

proto文件

// 声明protobuf的版本
syntax = "proto3";
// 声明代码所在的包, 相当他cpp的namespace
package fixbug;// 定义下面选项, 才可以生成service服务类和rpc方法描述, 默认不生成
option cc_generic_services = true;message ResultCode {int32 errcode = 1;bytes errmsg = 2;bool success = 3;
}// 定义登录消息类型(结构体)
message LoginRequest {// 1 表示数据的序号bytes name = 1; // bytes = stringbytes pwd = 2;
}// 定义登录响应消息类型
message LoginResponse {ResultCode result = 1;bool success = 2;
}message GetFriendListsRequest { uint32 userid = 1; }message User {bytes name = 1;uint32 age = 2;enum Sex {MAN = 0;WOMAN = 1;}Sex sex = 3;
}message GetFriendListsResponse {ResultCode result = 1;bool success = 2;// 存储列表repeated User friend_list = 3;
}// 在protobuf里面定义描述rpc方法的类型 -service
service UserServiceRpc {rpc Login(LoginRequest) returns (LoginResponse);rpc GetFriendList(GetFriendListsRequest) returns (GetFriendListsResponse);
}

在终端中执行

protoc test.proto --cpp_out=./

test.proto是你自定义的proto文件

然后会得到test.pb.h、test.pb.cc文件

proto自定义数据结构与.pb.h中函数的关系

test.pb.h初看有些复杂,但其实都是有规律的

image-20241012201312528

1.常规变量类型

这里的常规变量,指的是string、int等类型,而不是自定义的数据结构

// 定义登录消息类型(结构体)
message LoginRequest {// 1 表示数据的序号bytes name = 1; // bytes = stringbytes pwd = 2;
}

转为pb.cc文件后,主要分为两种读写函数:

  • set_变量名():如set_name(),往name变量中写数据
  • 变量名():如name(),只读访问name变量

2.自定义变量类型

这里的常规变量,指的是string、int等类型,而不是自定义的数据结构

message GetFriendListsResponse {ResultCode result = 1;bool success = 2;// 存储列表repeated User friend_list = 3;
}

转为 pb.cc 文件后,主要分为两种读写函数:

  • mutable_变量名():如ResultCode* mutable_result(),获得变量result的指针,之后就可读可写了
  • 变量名():如name(),只读访问name变量

注意对于 repeated User friend_list 变量,还会有:

使用 repeated 关键字定义的字段在 Protobuf 序列化和反序列化时会被当作一个集合或数组来处理。这个 User friend_list 可以作为一个动态数组来使用。

  • add_变量名():如 User* add_friend_list(),它返回的是要新增元素地址

3.service服务

在proto中我们会定义远程调用的服务函数

service UserServiceRpc {rpc Login(LoginRequest) returns (LoginResponse);rpc GetFriendList(GetFriendListsRequest) returns (GetFriendListsResponse);
}
  • 转为pb.cc文件后,会从 ”结构体“名 (这里是 UserServiceRpc)继承,得到 ”结构体“名_Stub 这个类(这里是UserServiceRpc_Stub
  • UserServiceRpc_Stub 的构造函数是由一个 RpcChannel* channel 作为参数的传入的
  • 而 proto 文件中定义的 LoginGetFriendList 函数,本质上是调用 CallMethod 函数(channel_->CallMethod(descriptor()->method(0),controller, request, response, done);
  • 再追溯一下,RpcChannel 是一个类,里面是 CallMethod 函数是虚函数,这说明 RpcChannel 类以及它的 CallMethod 函数,都需要我们开发者进行重写

序列化与反序列化

  • 序列化是将数据结构或对象转换为可以存储或传输的格式(通常是字节序列/string类型)的过程。

    其目的是将复杂的数据结构转化为一种便于存储、传输或在不同系统之间交换的形式。

  • 反序列化则是序列化的逆过程,它将序列化后的数据(如字节流)重新转换回原始的数据结构或对象。

    假设我们有一个包含学生姓名、年龄和成绩的对象。序列化可能会将这个对象转换为一个特定格式的字符串,如 {“name”:“张三”,“age”:20,“score”:90} 。而反序列化就是把接收到的这样的字符串重新转换回包含姓名、年龄和成绩的学生对象。

image-20241012204439211

【protobuf】ProtoBuf——序列化概念、序列化和反序列化、为什么需要序列化和反序列化、如何实现序列化、ProtoBuf 是什么、ProtoBuf 的使用特点-CSDN博客

#include "test.pb.h"
#include <iostream>
#include <string>
using namespace fixbug;int main()
{// 初始化变量, 封装了login请求对象的数据LoginRequest req;req.set_name("zhang san");req.set_pwd("123456");// 对象数据序列化, => stringstd::string send_str;if(req.SerializeToString(&send_str)){std::cout << send_str << std::endl;}// 从send_str中反序列化一个login请求对象LoginRequest reqB;if(reqB.ParseFromString(send_str)){std::cout << reqB.name() << std::endl;std::cout << reqB.pwd() << std::endl;}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI绘画】Midjourney进阶:三分线构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;三分线构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&a…

D35【python 接口自动化学习】- python基础之输入输出与文件操作

day35 文件合并 学习日期&#xff1a;20241012 学习目标&#xff1a;输入输出与文件操作&#xfe63;-47 如何使用python合并多个文件&#xff1f; 学习笔记&#xff1a; 合并文件需求分析 合并两个文件 代码实现 # 合并两个文件 with open(demo1.txt) as f1:file_data_1f…

Django学习笔记之Django基础学习

Django笔记 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录…

Solidity基础语法

Solidity的在线编辑器&#xff1a;https://remix.ethereum.org/ 一、合约结构 1、SPDX许可标识&#xff1a;指定代码的开源许可 2、pragma指令&#xff1a;声明Solidity版本 3、导入语句&#xff1a;引入其他合约或库 4、合约声明&#xff1a;使用contract关键字 5、状态变量&…

C#自定义特性

特性的用处 一般用来影响某一个类的个别字段或者方法 定义特性 需要将类继承Attribute 可以通过构造函数的方式影响使用特性的方法 可以通过给自定义的特性通过加AttributeUsage特性的方法进行进一步管理 AttributeUsage特性默认传三个参数 第一个参数一般用来约束此自定义…

黑马程序员 javaWeb基础学习,精细点复习【持续更新】

文章目录 WEB开发一、HTML1.html介绍 二、CSS1.CSS介绍2.CSS导入方式3.CSS选择器4.CSS属性 三、JavaScript1.介绍2.浏览器3.js的三种输出方式4.js定义变量5.js数据类型6.js运算符7.全局函数8.函数定义9.js数组对象10.js正则对象11.字符串对象12.自定义对象13.BOM浏览器对象模型…

电脑无线网wifi和有线网同时使用(内网+外网同时使用)

一、要求 我这里以无线网wifi为外网&#xff0c;有线网卡为内网为例&#xff1a; 一、基本信息 无线wifi&#xff08;外网&#xff09;&#xff1a;ip是192.168.179.235&#xff0c;网关是192.168.179.95有线网&#xff08;内网&#xff09;&#xff1a;ip是192.168.10.25&…

系统思考与业务创新工作坊

圆满结束两天的新华三《系统思考与业务创新工作坊》项目&#xff01;在这次工作坊中&#xff0c;我们不仅深入探讨了如何通过系统思维看清复杂的业务全貌&#xff0c;还一起探索了创新背后的逻辑与突破口。 系统思考不是一时的灵感&#xff0c;而是一种持久的思维模式&#xff…

折叠翼弹射无人机产品技术详解

折叠翼无人飞行器系统采用储存、运输、发射一体化设计&#xff0c;飞行器平台可以折叠入筒&#xff0c;采用筒式气体弹射方式发射&#xff0c;其搭载可见光/红外双光载荷与战斗部&#xff0c;可以对敌方中大型坦克、装甲或防御工事进行打击。产品技术详解如下&#xff1a; 一、…

无人机之视觉技术篇

一、视觉传感器的类型 摄像头&#xff1a; 最常见的视觉传感器&#xff0c;能够捕捉可见光图像和视频。 通过单目、双目或多目摄像头的组合&#xff0c;无人机能够实现立体视觉&#xff0c;从而估算距离、深度&#xff0c;并进行物体识别和追踪。 红外传感器&#xff1a; …

推荐几本编程入门书目

对于编程入门&#xff0c;推荐以下几本书籍&#xff0c;这些书籍覆盖了不同的编程语言&#xff0c;适合零基础的学习者逐步掌握编程基础&#xff1a; 1. 《Python编程快速上手——让繁琐工作自动化》 特点&#xff1a;以简单易懂的方式介绍了Python的基础知识和编程概念&#…

UE5 使用Animation Budget Allocator优化角色动画性能

Animation Budget Allocator是UE内置插件&#xff0c;通过锁定动画系统所占CPU的预算&#xff0c;在到达预算计算量时对动画进行限制与优化。 开启Animation Budget Allocator需要让蒙皮Mesh使用特定的组件&#xff0c;并进行一些编辑器设置即可开启。 1.开启Animation Budget…

智慧油田智能安全管控方案-AI助力油气田安全管控升级

在科技日新月异的今天&#xff0c;万物纵横科技凭借其前沿的智慧油田智能安全管控方案&#xff0c;正引领着油气田行业向智能化、高效化转型。该方案深度融合了AI视频智能分析与AIoT&#xff08;物联网人工智能&#xff09;技术&#xff0c;为采油场、油气场的设备运维、环境监…

记录使用appium+夜神模拟器测试多设备时selenium和appium版本不兼容带来的问题

记录使用appium夜神模拟器测试多设备时selenium和appium版本不兼容带来的问题 好不容易解决了selenium和appium的版本冲突问题&#xff08;导致&#xff1a;AttributeError: ‘NoneType’ object has no attribute to_capabilities’异常发生&#xff09; 第二天运行代码发现…

腾讯云Android 与 iOS 相关

移动端&#xff08;Android/iOS&#xff09;支持哪几种系统音量模式&#xff1f; 支持2种系统音量类型&#xff0c;即通话音量类型和媒体音量类型&#xff1a; 通话音量&#xff1a;手机专门为通话场景设计的音量类型&#xff0c;使用手机自带的回声抵消功能&#xff0c;音质…

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说&#xff0c;设备上积累的垃圾文件可能会导致存储空间变得紧张&#xff0c;影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户&#xff0c;更容易感受到存储空间的压力。面对这种情况&#xff0c;寻找一种有效的苹…

【自动驾驶】控制算法(十二)横纵向综合控制 | 从理论到实战全面解析

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

R语言从多波段tif数据中逐个提取单波段数据

在遥感和地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;将多个波段存储在一个文件中可以更有效地进行数据压缩和管理&#xff0c;减少了存储空间的需求。 在R语言中&#xff0c;处理多波段栅格数据通常涉及以下步骤&#xff1a; 读取数据&#xff1a;使用raster包中…

蓝桥杯模块三:蜂鸣器和继电器的基本控制

模块训练题目&#xff1a; 一、蜂鸣器电路图 1.电路图 2.电路分析 138译码器控制Y5,Y5控制Y5C&#xff0c;Y5C低电平控制芯片开启P0口控制ULN2003继而控制蜂鸣器端口和继电器端口 二、程序代码 1.138译码器控制端口函数 建立初始化函数选择锁存器 2.实现题目功能 在LED代…