FlatBuffers 是一个用于序列化和反序列化数据的开源库,它强调高性能和灵活性。下面是一个简单的 FlatBuffers C++ 示例,该示例将展示如何定义一个简单的 FlatBuffers schema、生成 C++ 代码,并使用生成的代码来序列化和反序列化数据。
定义 FlatBuffers schema
首先,你需要定义一个 .fbs
文件来定义你的数据结构。例如,我们创建一个名为 example.fbs
的文件,内容如下:
namespace MyGame.Example;
table Person {
name:string;
age:int;
}
root_type Person;
生成 C++ 代码
使用 flatc
(FlatBuffers 编译器)来从 .fbs
文件生成 C++ 代码。
-
flatc -c example.fbs
这将会生成一个名为
example_generated.h
的头文件。
C++代码示例
-
接下来,我们将使用生成的 C++ 代码来序列化和反序列化一个
Person
对象。
#include "example_generated.h"
#include <flatbuffers/flatbuffers.h>
int main() {
// 创建一个 FlatBufferBuilder 实例,用于构建序列化数据
flatbuffers::FlatBufferBuilder builder;
// 序列化字符串 "John"
auto name = builder.CreateString("John");
// 序列化 Person 对象
auto person = MyGame::Example::CreatePerson(builder, name, 30);
// 结束构建并获取序列化数据的指针
builder.Finish(person);
// 获取序列化数据的指针和大小
uint8_t *buf = builder.GetBufferPointer();
int size = builder.GetSize();
// ... 在这里,你可以将 buf 和 size 发送到网络或保存到文件中 ...
// 现在,我们来反序列化数据
// 验证 FlatBuffer 数据
flatbuffers::Verifier verifier(buf, size);
if (!MyGame::Example::VerifyPersonBuffer(verifier)) {
fprintf(stderr, "flatbuffers: data is not a valid MyGame.Example.Person\n");
return -1;
}
// 获取反序列化后的 Person 对象
auto person_ptr = MyGame::Example::GetPerson(buf);
// 访问 Person 对象的数据
std::cout << "Name: " << person_ptr->name()->c_str() << ", Age: " << person_ptr->age() << std::endl;
return 0;
}
编译运行:
确保你已经安装了 FlatBuffers 库,并将生成的 example_generated.h
和 FlatBuffers 的库文件(如 flatbuffers.h
和相关的 .cpp
文件)添加到你的项目中。然后,你可以使用 C++ 编译器来编译和运行你的代码。
注意:以上代码假设你已经正确设置了你的项目来包含 FlatBuffers 库和生成的头文件。如果你的项目设置不同,你可能需要相应地调整包含路径和链接库。