Protobuf适合通用通信,FlatBuffers用于高性能场景;前者需序列化反序列化,后者零拷贝读取快;根据需求选型,流程均为定义schema、生成代码、调用API实现序列化。

在C++中使用Protobuf或FlatBuffers这类数据序列化框架,能高效地将结构化数据序列化为二进制格式,便于存储或网络传输。下面分别介绍如何在C++项目中集成和使用这两种主流序列化工具。
Protobuf 是 Google 开发的成熟序列化库,支持多种语言,性能优秀,适合需要强类型定义和跨平台通信的场景。
1. 安装 Protobuf 编译器和库在 Ubuntu 上安装:
在 macOS 上可通过 Homebrew:
立即学习“C++免费学习笔记(深入)”;
创建一个 message.proto 文件:
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
string email = 3;
}
运行 protoc 编译器:
会生成 message.pb.h 和 message.pb.cc 两个文件。
4. 在 C++ 中使用编写主程序:
#include "message.pb.h"
#include <iostream>
#include <fstream>
int main() {
Person person;
person.set_name("Alice");
person.set_age(30);
person.set_email("alice@example.com");
// 序列化到文件
std::ofstream output("person.bin", std::ios::binary);
person.SerializeToOstream(&output);
output.close();
// 反序列化
Person person2;
std::ifstream input("person.bin", std::ios::binary);
person2.ParseFromIstream(&input);
input.close();
std::cout << "Name: " << person2.name() << ", Age: " << person2.age() << "\n";
return 0;
}
编译时需链接 protobuf 库:
FlatBuffers 是 Google 推出的零解析(zero-copy)序列化库,读取数据无需反序列化,速度快,内存占用低,适合性能敏感场景如游戏或嵌入式系统。
1. 安装 FlatBuffers克隆仓库并编译 flatc 编译器:
git clone https://github.com/google/flatbuffers.git cd flatbuffers cmake -G "Unix Makefiles" make sudo make install
创建 schema.fbs:
table Person {
name:string;
age:int;
email:string;
}
root_type Person;
运行 flatc 工具:
生成 schema_generated.h 文件。
4. 在 C++ 中序列化与反序列化示例代码:
#include "schema_generated.h"
#include <iostream>
#include <vector>
#include <fstream>
int main() {
flatbuffers::FlatBufferBuilder builder;
auto name = builder.CreateString("Bob");
auto email = builder.CreateString("bob@example.com");
PersonBuilder pb(builder);
pb.add_name(name);
pb.add_age(25);
pb.add_email(email);
auto person = pb.Finish();
builder.Finish(person);
// 获取 buffer 指针和长度
uint8_t *buf = builder.GetBufferPointer();
size_t size = builder.GetSize();
// 写入文件
std::ofstream output("person.fb", std::ios::binary);
output.write(reinterpret_cast<char*>(buf), size);
output.close();
// 读取并访问(无需解析)
std::ifstream input("person.fb", std::ios::binary | std::ios::ate);
size_t fileSize = input.tellg();
input.seekg(0, std::ios::beg);
std::vector<uint8_t> buffer(fileSize);
input.read(reinterpret_cast<char*>(buffer.data()), fileSize);
input.close();
auto p = GetPerson(buffer.data());
std::cout << "Name: " << p->name()->c_str()
<< ", Age: " << p->age() << "\n";
return 0;
}
包含 FlatBuffers 头文件路径,并链接标准库即可:
选择哪种框架取决于具体需求:
两者都需要先定义 schema,再生成代码,集成进 C++ 项目流程清晰。根据延迟要求、数据大小和可维护性权衡选择即可。
基本上就这些。配置好环境、写好 schema、生成代码、调用 API,就能在 C++ 中高效使用序列化功能了。
以上就是c++++怎么使用Protobuf或FlatBuffers_c++数据序列化框架使用教程的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号