本文共 2675 字,大约阅读时间需要 8 分钟。
FlatBuffers 是一个开源 序列化 库,提供与 Protocol Buffers、Thrift、Apache Avro 等类似的序列化格式。它由 Wouter van Oortmerssen 开发,后由 Google 开源,主要用于 Android 游戏和注重性能的应用。FlatBuffers 支持多种语言的端口,包括 C++、C#、C、Go、Java、PHP、Python 和 JavaScript。
FlatBuffers 是一个二进制 buffer,它通过 offset 组织嵌套对象(如 struct、table、vector 等),允许直接访问数据与传统指针方式类似。然而,大多数内存结构与 FlatBuffers不同,后者采用严格的对齐规则和字节顺序,以确保跨平台兼容。此外,table 对象支持前向/后向兼容性和 optional 字段,方便应对数据格式的演变。
FlatBuffers 的主要优势在于避免反序列化。通过定义二进制数据协议,FlatBuffers 将数据直接转换为二进制格式,无需额外的反序列化步骤。与传输 JSON 的流程相比,FlatBuffers 的二进制文件可以直接读取和解析,显著提高性能。
FlatBuffers 支持基本类型和复杂类型:
基本类型:
特殊类型:
复杂类型:
安装 flatc 工具需要以下步骤:
安装 CMake:
apt install cmake
克隆 FlatBuffers 源码:
git clone https://github.com/google/flatbuffers.git
进入项目根目录,生成 Makefile 并编译:
cmake -G "Unix Makefiles" make make install
验证 flatc 版本:
flatc --version
以下是 FlatBuffers 的一个基本测试用例:
#include "test_generated.h" #include#include using namespace std; using namespace TestApp; int main() { FlatBufferBuilder builder; vector vec; for (size_t i = 0; i < 10; ++i) { vec.push_back(i); } auto id = 123; auto name = builder.CreateString("name"); auto list = builder.CreateVector(vec); uint8_t flag = 1; KV kv(1, 1.0); auto mloc = CreateTestObj(builder, id, name, flag, list, &kv); builder.Finish(mloc); char* ptr = (char*)builder.GetBufferPointer(); uint64_t size = builder.GetSize(); auto obj = GetTestObj((uint8_t*)ptr); cout << obj->id() << endl; cout << obj->name()->c_str() << endl; cout << obj->flag() << endl; for (size_t i = 0; i < obj->list()->size(); ++i) { cout << obj->list()->Get(i) << endl; } return 0; }
g++ -std=c++11 ./test.cpp -I /home/ws/code/flatbuffers/include/ ./a.out
输出结果:
123 name 0 1 2 3 4 5 6 7 8 9 1 1
#include "flatbuffers/flatbuffers.h" namespace TestApp { struct KV { key: ulong; value: double; } table TestObj { id: ulong; name: string; flag: ubyte = 0; list: [ulong]; kv: KV; } root_type TestObj; }
通过以上步骤,您可以成功使用 FlatBuffers 进行数据序列化与反序列化,优化应用的性能表现。
转载地址:http://cjuzk.baihongyu.com/