Qt/C++ 序列化(protobuf方式)

2024-06-21 04:04
文章标签 c++ qt 方式 序列化 protobuf

本文主要是介绍Qt/C++ 序列化(protobuf方式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、序列化介绍

序列化是将需要的内存对象转换为字节流或者其他数据格式的过程,以便保存到文件或者传输。反序列化则是将数据还原到内存对象。
序列化后存档格式有二进制数据、XML或JSON文件等。可以按照自己的需求进行序列化。

二、protobuf介绍

Protocal Buffers(简称protobuf)是谷歌使用的一项技术标准,可以将数据保存为二进制格式,完成序列化和反序列化。

优势与缺点

(优势)跨语言、跨平台、可扩展,比XML、JSON等占用空间小,效率高。
(缺点)可读性比XML,JSON等效果差。
JSON、XML是很多行业标准,而protobuf只是Google公司的内部标准。

三、工具包生成

1. 工具包下载

在github上下载,地址:https://github.com/protocolbuffers/protobuf/releases
选择一个C++版本,下载后解压。
在这里插入图片描述

2. 库生成

下载cmake工具,将cmake工具configure配置好后,执行后生成protobuf相关的解决方案
在这里插入图片描述
打开protobuf.sln,通过你的VS编译工具,编译后生成工具及库。

在这里插入图片描述

四、序列化流程

1. proto文件

新建一个文本文件,为了将数据实现序列化,需要将数据整理成message(相当于结构体)的基本类型写入文件。数据保存后扩展名改为proto文件,proto文件示例如下:
在这里插入图片描述
上图中
(1)syntax = “proto3” 指protobuf的版本号,当前主版本为3。
(2)可以声明一个package XX,后续利用它生成的源文件会将XX替换为命名空间,将序列化的模块加入到该命名空间中。
(3)定义message内容,message内会有多个变量,每个变量有个对应的编号,而且不同变量的编号不能重复。
protobuf中常用的数据类型:

数据类型说明
bool布尔类型
double64位浮点数
float32位浮点数
int3232位整数
int6464位整数
uint6464位无符号整数
sint3232位整数,处理负数效率更高
sint6464位整数,处理负数效率更高
string只能处理ASCII字符
bytes用于处理多字节的语言字符
enum枚举类型

2. 生成序列化接口文件

打开cmd控制台,切换到前面生成protoc.exe路径,输入命令protoc ./test.proto --cpp_out=./,将会从XX.proto 文件生成相应语言(cpp,c#, java)的接口文件,然后加入到我们的项目中进行使用。
在这里插入图片描述
生成的文件名为Test.pb.h,Test.pb.cc
在这里插入图片描述

3. Qt中的配置使用

(1)定义PROTOBUF_USE_DLLS使用
(2)从原始protobuf工具包中的头文件文件夹(src)拷贝到当前项目中,并添加
在这里插入图片描述

(3)将你编译环境生成的libprotobuf库及路径包含引用

#switch protobuf
DEFINES += PROTOBUF_USE_DLLSSOURCES += $$PWD/proto/test.pb.cc \$$PWD/pserializer.cppHEADERS += $$PWD/proto/test.pb.h \$$PWD/pserializer.hINCLUDEPATH += $$PWD/srcwin32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/release -llibprotobuf
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/debug -llibprotobufd

4. 序列化和反序列化代码

serializeToString函数:序列化为字符串
ParseFromString函数:从字符串中反序列化

void PSerializer::serializer()
{// 序列化testPackage::Person person;person.set_id(0);person.set_name("lihua");person.set_sex("man");person.set_age(25);std::string string;if (!person.SerializeToString(&string)) {qDebug() << " Serialize Failed";}qDebug() << "string" << string.c_str();//反序列化testPackage::Person person1;if(!person1.ParseFromString(string)){qDebug() << " Parse Failed";}qDebug() << "person1.id"   << person1.id();qDebug() << "person1.name" << person1.name().c_str();qDebug() << "person1.sex"  << person1.sex().c_str();qDebug() << "person1.age"  << person1.age();
}

至此,我们完成一个简单的protobuf序列化和反序列化的实现。

这篇关于Qt/C++ 序列化(protobuf方式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080150

相关文章

如何合理使用Spring的事务方式

《如何合理使用Spring的事务方式》:本文主要介绍如何合理使用Spring的事务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、底层构造1.1.事务管理器1.2.事务定义信息1.3.事务状态1.4.联系1.2、特点1.3、原理2. Sprin

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线