希望我们不仅把编程当成一份工作,更要将其当成一份热爱!!!
-----潜意识中有个想成为一名厉害的程序员的梦
protobuf的作用
核心作用就是用于对象的序列化和反序列化。
序列化的意思:就是将我们的对象转换为二进制字节流进行存储(文件)或者数据发送。
反序列化的意思:将存储的(文件)或者接收到的(数据传输) 二进制字节流转换为我们的对象。
protobuf的使用过程
- 通过.proto文件来定义我们的对象结构(类似于写一个类)
- 利用protoc编译器 将.proto文件 编译为:一个.cc文件、一个.h文件
- 将.cc 文件 .h文件 加入到项目之中,配置protobuf的包含目录、库目录、库依赖
- 编写示例代码
我们来展开上述过程
1.编写my_examble.proto文件,内容如下:
syntax = "proto3"; //protobuf版本
package example;
// 定义一个简单的消息体 ,类似定义一个类//其中=1,=2 不是赋值的意思,是用于标识字段的,可以理解为字段ID
message SimpleMessage {
int32 id = 1; // 消息ID
string message = 2; // 消息内容
}
2.安装protoc编译器、依赖库
为了结构清晰,另写了一篇windows下protobuf编译器、依赖库的cmake安装-CSDN博客
3.编译my_examble.proto
- 进入my_examble.proto 所在目录,鼠标右键,选择”在终端中打开“ 进入命令行
![]() | ![]() |
- 输入以下命令
protoc --proto_path=. --cpp_out=. my_examble.proto
![]() |
- 执行完毕后,出现以下两个文件
![]() |
4.将上述文件加入到项目之中,配置protobuf的包含目录、库目录、库依赖
- 新建控制台项目、拷贝上述文件到你的项目目录(注意这里是”项目目录“,不是”解决方案目录“,要不然到时候会找不到头文件的);添加文件到工程。
![]() | ![]() |
- 设置平台为DEBUG X64(下面的图片关于平台的选择有误,懒得改了)
- 配置这个,这个很重要
![]() |
- 包含protobuf库文件目录:此目录为安装protoc编译器、依赖库(windows下protobuf编译器、依赖库的cmake安装-CSDN博客)时,生成的库文件所在目录。
![]() | ![]() |
- 添加libprotobufd.lib;libprotocd.lib库依赖
![]() | ![]() |
- 添加包含目录,此目录为windows下protobuf编译器、依赖库的cmake安装-CSDN博客中下载的软件包中的。
![]() | ![]() |
5.编写如下代码,运行
#include <iostream>
#include <string>
#include "my_examble.pb.h"
int main() {
// 初始化protobuf库
GOOGLE_PROTOBUF_VERIFY_VERSION;
// 创建一个消息实例
example::SimpleMessage msg;
msg.set_id(10);
msg.set_message("Hello, Protobuf!");
// 序列化消息
std::string serialized;
if (!msg.SerializeToString(&serialized)) {
std::cerr << "Failed to write msg." << std::endl;
return -1;
}
// 反序列化消息
example::SimpleMessage msg2;
if (!msg2.ParseFromString(serialized)) {
std::cerr << "Failed to parse msg." << std::endl;
return -1;
}
// 输出反序列化后的消息
std::cout << "ID: " << msg2.id() << std::endl;
std::cout << "Message: " << msg2.message() << std::endl;
// 清理protobuf库使用的所有全局对象
google::protobuf::ShutdownProtobufLibrary();
return 0;
}
运行结果:
![]() |