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

news2024/11/24 7:04:49

概述

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 = string
  bytes 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 = string
  bytes 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");

    // 对象数据序列化, => string
    std::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.coloradmin.cn/o/2209214.html

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

相关文章

Linux下以编译源码的方式安装Qt5与Qt6及其使用

文章目录 概要资源下载依赖安装编译Qt5Qt6 遇到的问题qtchooser使用 概要 自 Qt 5.15 开始&#xff0c;不再提供 open source offline installers&#xff0c;也就是原来的 .run 的安装文件&#xff0c;只能通过源码编译来安装了参考文章 资源下载 源码网址&#xff0c;链接…

【C语言复习】分支和循环

【C语言复习】分支和循环 1. if语句1.1 if1.2 else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题 2.关系操作符3. 条件操作符4.逻辑操作符&#xff1a;&& 、|| 、!4.1 逻辑取反运算符4.2 与运算符4.3或运算符4.4 练习&#xff1a;闰年的判断4.5短路 5.switch 语句5.1…

【黑苹果】记录MacOS升级Sonoma的过程

【黑苹果】记录MacOS升级Sonoma的过程 一、硬件二、提前说明三、准备OC四、选择驱动五、选择ACPI六、下载内核扩展七、其他问题 一、硬件 设备是神舟zx6-ct5da 具体参照下图 二、提前说明 本机器已经安装过 macOS Monterey 12.6&#xff0c;这次是升级到 macOS Sonoma 14。 …

GoogLeNet,代码示例,辅助分类器,Inception

亮点&#xff1a; 引入了Inception结构&#xff08;融合不同尺度的特征信息&#xff09; 使用1x1的卷积核进行降维以及映射处理 添加两个辅助分类器帮助训练 丢弃全连接层&#xff0c;使用平均池化层&#xff08;大大减少模型 参数&#xff09; GoogLeNet的网络连接图&…

LInux学习FreeType编程

文章目录 使用freetype 显示一个文字使用 freetype 显示一行文字了解笛卡尔坐标系每个字符的大小可能不同怎么在指定位置显示一行文字freetype 的几个重要数据结构1、**FT_Library**结构体2、FT_Face结构体3、FT_GlyphSlot结构体4、FT_Glyph结构体5、FT_BBox结构体 读懂显示一行…

Linux运维_Apache更改默认网站目录

1.首先创建目录 并且在目录下新建测试文件 index.html mkdir -p /home/test/ap_web 直接wget 百度官网 wget www.baidu.com 2.编辑配置文件 /etc/apache2/sites-available/000-default.conf(找到 DocumentRoot)更改为刚刚创建的目录 接着在添加 最终文件: 3.给文件 添加属…

Nacos配置管理和Nacos集群配置

目录 Nacos作为配置中心实现配置管理 统一配置管理 如何在nocas添加配置文件 在微服务拉取nacos配置中心的配置 1&#xff09;引入nacos-config依赖 2&#xff09;添加bootstrap.yaml 3&#xff09;测试&#xff0c;读取nacos配置中心中配置文件的内容 ​编辑 总结&…

在Spring Boot中具有多个实现的接口正确注入的六种方式

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;当一个接口具有多个实现时&#xff0c;正确地将这些实现注入到需要使用它们的地方是一个常见的需求。以下是在Spring Boot中实现这一目标的六种方式&#xff1a; 1. 使用Autowir…

maven聚合ssm

如果没有写过ssm项目请移步SSM后端框架搭建&#xff08;有图有真相&#xff09;-CSDN博客 数据库准备 create table user (id int (11),uid varchar (60),name varchar (60),age int (11),sex varchar (12) ); insert into user (id, uid, name, age, sex) values(10,202409…

小米电机与STM32——CAN通信

背景介绍&#xff1a;为了利用小米电机&#xff0c;搭建机械臂的关节&#xff0c;需要学习小米电机的使用方法。计划采用STM32驱动小米电机&#xff0c;实现指定运动&#xff0c;为此需要了解他们之间的通信方式&#xff0c;指令写入方法等。花了很多时间学习&#xff0c;但网络…

LINUX网络编程:cookie和session

目录 1.cookie 1.2.cookie原理 1.3.cookie的格式以及字段 字段介绍&#xff1a; 完整的cookie 1.4.cookie的安全问题 2.session 2.2session的原理 1.cookie 在大家在浏览b站的时候&#xff0c;都会发现一个问题&#xff0c;当我们登录过一次之后&#xff0c;下次点开b站…

2024年最新Stable Diffusion模型资源合集!附整合安装包!

&#xff08;模型资源在ComfyUI、WebUI以及ForgeUI中都通用&#xff09; 之前的Stable Diffusion笔记受到了不少小伙伴的关注&#xff0c;很感谢大家的建议和支持。有很多小伙伴私信我问我一些AI绘画的模型资源在哪来下载&#xff0c;一般来说有两个网站比较常用&#xff0c;分…

位操作解决数组的花样遍历

文章目录 题目 一、思路&#xff1a; 二、代码 总结 题目 leetcodeT289 https://leetcode.cn/problems/game-of-life/description/ 一、思路&#xff1a; 这题思路很简单&#xff0c;对每个位置按照题目所给规则进行遍历&#xff0c;判断周围网格的活细胞数即可。但是题目要求…

【LVGL快速入门】SquareLine Studio安装教程(LVGL官方工具)

一.简介与导航&#xff1a; SquareLine Studio是由LVGL官方开发的一款UI设计工具&#xff0c;采用图形化进行界面UI设计&#xff0c;轻易上手。 SquareLine Studio官方网址&#xff1a;https://squareline.io/SquareLine Studio官方文档&#xff1a;https://docs.squareline.io…

太阳能电池特性及其应用

中南民族大学-通信工程2024-大学物理下实验 目录 代码实现结果显示 &#x1f6e0;工具使用 MarsCode&#xff08;插件&#xff0c;集成在PyCharm&#xff09;&#xff1b; python编程&#xff08;豆包AI智能体&#xff09; &#x1f4bb;编程改进 此处是用「Matplotlib」来作图…

Monkey测试工具大盘点!如何选怎么用全整明白了!

什么是Monkey测试&#xff1f; 以下是官方说法&#xff1a; Monkey 测试是通过向系统发送伪随机的用户事件流&#xff08;如按键输入、触摸屏输入、手势输入等&#xff09;&#xff0c;实现对应用程序客户端的稳定性测试&#xff1b;这种随机性可以模拟真实用户的行为&#x…

理解Web3的互操作性:不同区块链的连接

随着Web3的迅速发展&#xff0c;互操作性成为区块链技术中的一个核心概念。互操作性指的是不同区块链之间能够无缝地交流和共享数据&#xff0c;从而实现更加高效和灵活的生态系统。本文将探讨Web3中互操作性的意义、面临的挑战以及未来的发展趋势。 1. 互操作性的意义 在Web…

优达学城 Generative AI 课程3:Computer Vision and Generative AI

文章目录 1 官方课程内容自述第 1 课&#xff1a;图像生成简介第 2 课&#xff1a;计算机视觉基础第 3 课&#xff1a;图像生成与生成对抗网络&#xff08;GANs&#xff09;第 4 课&#xff1a;基于 Transformer 的计算机视觉模型第 5 课&#xff1a;扩散模型第 6 课&#xff0…

利用AI大模型,增强你的DevOps!

前言 自从去年春天ChatGPT问世之后&#xff0c;互联网也掀起了拥抱AI的浪潮&#xff0c;不仅是各大头部大厂相继发布大模型产品&#xff0c;在开发者的Coding过程中也紧跟时代&#xff0c;一些热门插件也纷纷受到了开发者的青睐&#xff0c;比如GitHub Copilot的智能代码生成。…

数据结构编程实践20讲(Python版)—05二叉树

本文目录 写在前面:大“树”下好乘凉定义主要术语基本特征主要应用领域:05 二叉树Binary treeS1 说明S2 示例S3 二叉树类型(1)满二叉树(Perfect Binary Tree)(2)完全二叉树(Complete Binary Tree)(3)二叉搜索树(Binary Search Tree)(4)平衡二叉树(Balanced Bin…