基于VScode和C++ 实现Protobuf数据格式的通信

news2024/9/19 10:36:49

目录

  • 1. Protobuf 概述
    • 1.1 定义
    • 1.2Protobuf的优势
  • 2. Protobuf 语法
  • 3、序列号和反序列化
    • 3.1 .pb.h 头文件
    • 3.2 序列化
    • 3.3 反序列化
  • 4、测试用例

Protobuf详细讲解链接
在这里插入图片描述

1. Protobuf 概述

1.1 定义

protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python 等,每一种实现都包含了相应语言的编译器以及库文件。

由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

1.2Protobuf的优势

使用Protobuf 进行数据通信的优势可以简短概括为以下几点:

  1. 效率:二进制格式,序列化和反序列化速度快。
  2. 紧凑性:数据体积小,节省存储和传输带宽。
  3. 类型安全:编译时类型检查,减少运行时错误。
  4. 向后兼容:支持平滑升级,易于维护。
  5. 跨语言:支持多种编程语言。
  6. 扩展性:支持消息扩展,适应不断变化的数据需求。
  7. 字段编号:唯一标识,便于版本控制和更新。

2. Protobuf 语法

Protobuf文件后缀指定为 .proto,在文件的第一行需要指定Protobuf的版本号,有两个版本Protobuf 2 和 Protobuf 3,此处我们使用的是版本3。

// Person.proto
syntax = "proto3";

// 在该文件中对要序列化的结构体进行描述
message Person
{
    int32 id = 1;
    bytes name = 2;
    bytes sex = 3;	
    int32 age = 4;
}

message后面的名字就是生成的类的名字,自己指定一个合适的名字即可
等号后面的编号要从1开始,每个成员都有一个唯一的编号,不能重复,一般连续编号即可。

.proto文件编辑好之后就可以使用protoc工具将其转换为C++文件了:

protoc -I path .proto文件 --cpp_out=输出路径(存储生成的c++文件)

如果想要在当前目录下,也就是和.proto文件在一级目录下生成pb.cc和pb.h文件,执行:

$ protoc ./Person.proto --cpp_out=.
# 或者使用 -I 参数
$ protoc -I ./ Person.proto --cpp_out=.

3、序列号和反序列化

3.1 .pb.h 头文件

通过protoc 命令对.proto文件的转换,得到的头文件中有一个类,这个类的名字和 .proto文件中message关键字后边指定的名字相同,.proto文件中message消息体的成员就是生成的类的私有成员。

那么如何访问生成的类的私有成员呢? 可以调用生成的类提供的公共成员函数,这些函数有如下规律:

  • 清空(初始化) 私有成员的值: clear_变量名()
  • 获取类私有成员的值: 变量名()
  • 给私有成员进行值的设置: set_变量名(参数)
  • 得到类私有成员的地址, 通过这块地址读/写当前私有成员变量的值: mutable_变量名()
  • 如果这个变量是数组类型:
    (1)数组中元素的个数: 变量名_size()
    (2)添加一块内存, 存储新的元素数据: add_变量名() 、add_变量名(参数)

3.2 序列化

序列化是指将数据结构或对象转换为可以在储存或传输中使用的二进制格式的过程。在计算机科学中,序列化通常用于将内存中的对象持久化存储到磁盘上,或者在分布式系统中进行数据传输和通信。

Protobuf 中为我们提供了相关的用于数据序列化的 API,如下所示:

// 头文件目录: google\protobuf\message_lite.h
// --- 将序列化的数据 数据保存到内存中
// 将类对象中的数据序列化为字符串, c++ 风格的字符串, 参数是一个传出参数
bool SerializeToString(std::string* output) const;
// 将类对象中的数据序列化为字符串, c 风格的字符串, 参数 data 是一个传出参数
bool SerializeToArray(void* data, int size) const;

// ------ 写磁盘文件, 只需要调用这个函数, 数据自动被写入到磁盘文件中
// -- 需要提供流对象/文件描述符关联一个磁盘文件
// 将数据序列化写入到磁盘文件中, c++ 风格
// ostream 子类 ofstream -> 写文件
bool SerializeToOstream(std::ostream* output) const;
// 将数据序列化写入到磁盘文件中, c 风格
bool SerializeToFileDescriptor(int file_descriptor) const;

3.3 反序列化

反序列化是指将序列化后的二进制数据重新转换为原始的数据结构或对象的过程。通过反序列化,我们可以将之前序列化的数据重新还原为其原始的形式,以便进行数据的读取、操作和处理。

Protobuf 中为我们提供了相关的用于数据序列化的 API,如下所示:

// 头文件目录: google\protobuf\message_lite.h
bool ParseFromString(const std::string& data) ;
bool ParseFromArray(const void* data, int size);
// istream -> 子类 ifstream -> 读操作
// wo ri
// w->写 o: ofstream , r->读 i: ifstream
bool ParseFromIstream(std::istream* input);
bool ParseFromFileDescriptor(int file_descriptor);

4、测试用例

开发环境:Ubuntu20.04、VScode
本人仓库地址:基于VScode和C++ 实现Protobuf数据格式的通信
在这里插入图片描述

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

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

相关文章

大模型算法面试题(十八)

本系列收纳各种大模型面试题及答案。 1、P-tuning v2 思路、优缺点是什么 P-tuning v2是清华大学自然语言处理实验室(THUDM)等研究机构提出的一种新的预训练模型优化方法,主要关注如何通过动态构建任务相关的提示序列来引导预训练模型进行更…

点可云ERP进销存V8版本—购货入库单的操作使用及各单据状态说明

本章我们讲解购货入库单的操作使用,包括导入导出功能、资金结算、生成其他关联单据、以及各单据状态的说明处理。 购货入库单用于收货、验收、接受采购的商品,并进行验收确保质量和数量。而购货入库单和购货订单的区别在于购货订单的审核后只会记录单据&…

【考研数学】概率论:4 种方法解答一道题,你觉得哪种方法又快又好呢?

今天要给大家分享的笔记是:《用画图的方式求解概率论题目很方便,但难点在于如何画和怎么理解》 在这篇考研笔记中,「荒原之梦考研数学」为同学们提供了 4 种不同的方法解答这一道题目,其中最特别的是第一种通过画图求解的方法。 …

rocketMq的使用和消费模式(异步消息,单项消息(使用mq处理日志),推迟任务(占座买票),批量消息)

rocketMq开始使用 rocketmq是怎么使用的消费模式异步消息单项消息:使用mq处理日志延迟任务(占座买票)批量 rocketmq是怎么使用的 public class ASimpleTest {Testpublic void simpleProduce() throws Exception{DefaultMQProducer producer …

分享IP 地址混淆知识

由于IPv4 地址资源的枯竭促使 IPv6 技术的广泛应用,从而形成了 IPv4 和 IPv6 并存的局面。这就逐渐出现了 IP 地址混淆导致的网络问题。 IP 地址混淆的表现形式 地址分配错误 在同时支持两种协议的网络中,可能会出现将 IPv4 地址错误地分配给 IPv6 接口…

正则采集器之三——前端搭建

前端使用有名的饿了么管理后台,vue3版本vue3-element-admin,首先从gitee中克隆一个vue3-element-admin模板代码vue3-element-admin: Vue3 Element Admin开箱即用的中后台管理系统前端解决方案,然后在此基础上进行开发。 1、修改vite.config.…

正点原子imx6ull-mini-Linux驱动之按键输入实验(9)

在前几章我们都是使用的 GPIO 输出功能,还没有用过 GPIO 输入功能,本章我们就来学 习一下如果在 Linux 下编写 GPIO 输入驱动程序。I.MX6U-ALPHA 开发板上有一个按键,我们 就使用此按键来完成 GPIO 输入驱动程序,同时利用第四十七…

LeetCode40题: 组合总和 II(原创)

【题目描述】 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [1…

安装MongoDB UI客户端工具:mongodb-compass-1.40.2-win32-x64.msi

文章目录 1、安装 mongodb-compass-1.40.2-win32-x64.msi2、安装后配置链接地址: 1、安装 mongodb-compass-1.40.2-win32-x64.msi 2、安装后配置链接地址:

读书其实并没有那么大的作用

开场白 Hey,书虫们和生活探索者们!今天我们来聊聊一个老生常谈却又常谈常新的话题——读书。有人说,读书能改变命运,但也有人说,读书不过是生活的调味品。那么,读书到底有啥用?让我们一起来扒一…

卫星导航系统的应用领域与发展前景

当人们提到卫星导航系统,往往会联想到车载导航仪或手机上的地图应用。然而,卫星导航系统的应用远不止于此,它在许多领域都发挥着重要作用。下面将介绍几个卫星导航系统的应用领域及其发展前景。首先是海洋航行安全领域。在过去,海…

搜维尔科技:Haption:对于遥控机器人来说,触觉技术是什么

力反馈遥控机器人有哪些好处? 遥控机器人是机器人技术领域的一个领域,主要涉及远距离控制半自主机器人。它被定义为遥操作和远程呈现的结合。第一部分,遥控操作,使操作员能够远程控制机器人。第二部分,远程呈现&#…

全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程:29 类和对象的 Python 实现-断言与防御性编程和 help 函数的使用 摘要: 在 Python 中,断言是一种常用的调试工具,它允许程序员编写一条检查某个条件。本文主要介绍了断言的应用场景和特点以及 …

jmeter-beanshell学习13-设置等待时间

接口测试时候,如果交易成功,一切正常,如果交易失败,可能会涉及回滚。之前写的都是做完交易,紧接着去查库,就可能遇到还没回滚完成,已经查完库了,查出来的数据不准确。既然写beanshel…

前端低代码必备:FrontendBlocks 4.0版本重磅发布,助力Uniapp-X原生APP开发

项目介绍 本软件是一款强大的所见即所得前端页面设计器,是低代码开发领域的基础设施,生成的代码不依赖于任何框架,实测可以将前端布局工作的耗时减少80%以上,最关键的是,它实现了人人都可以写前端页面的梦想。 不用写…

相似度计算方法

一、相似度计算方法 相似度算法是计算两个或多个对象之间相似程度的方法,这些对象可以是文本、图像、音频等不同类型的数据。在计算机科学、信息检索、推荐系统、数据挖掘等领域中,相似度算法具有广泛的应用。 二、应用场景 搜索引擎:用于文…

实验3-2 计算符号函数的值

//实验3-2 计算符号函数的值#include <stdio.h> #include <math.h>int main() {int n 0;scanf("%d",&n);int sign;if(n > 0)sign1;else if(n < 0)sign-1;else sign0;printf("sign(%d) %d", n, sign); }

0731作业+梳理

一、作业 1.用两个进程完成拷贝 代码&#xff1a; #include<myhead.h> //定义一个求文件长度函数 int line(const char *pd1,const char *pd2) { int fd1 -1; int fd2 -1; //以只读形式打开源文件 if((fd1 open(pd1,O_RDONLY))-1) { p…

人最大的内耗,是不肯放过自己

你是否也有过这样的经历&#xff1a; 对别人漫不经心的一句话就琢磨很久&#xff0c;生怕产生隔阂&#xff1b;对自己曾经犯过的错误念念不忘&#xff0c;始终无法释怀&#xff1b;工作里出现一点小失误&#xff0c;便整宿翻来覆去难以入眠......每天陷在迷茫、焦虑、恐慌的情…