当前位置: 首页 > news >正文

038-flatbuffers

flatbuffers

FlatBuffers技术调研报告

一、核心原理与优势

FlatBuffers通过内存直接访问技术实现零拷贝序列化,其核心优势如下:

  • 内存布局:数据以连续二进制块存储,包含VTable(虚拟表)和Data Object(数据对象)。
  • 零拷贝特性:接收端无需解析即可直接访问数据,性能比JSON快6-10倍。
  • 向前兼容:Table结构支持字段动态扩展,新增字段需追加到末尾并指定ID。

二、C++实现流程与代码示例

  1. 数据定义(fbs文件)
// person.fbs 
table Person {
  name: string;
  age: int;
  friends: [Person];
}
root_type Person;
  1. 代码生成
flatc --cpp person.fbs 

生成person_generated.h包含序列化接口。

3. 序列化实现

#include "person_generated.h"
#include <flatbuffers/flatbuffers.h>
#include <vector>
#include <fstream>

int main() {
  flatbuffers::FlatBufferBuilder builder(1024);

  // 创建嵌套对象
  auto friend_name = builder.CreateString("Alice");
  auto friend_age = 30;
  auto friend_offset = CreatePerson(builder, friend_name, friend_age, 0);

  // 创建主对象
  auto name = builder.CreateString("Bob");
  auto age = 40;

  // 使用 CreateVector 方法创建向量
  std::vector<flatbuffers::Offset<Person>> friends = {friend_offset};
  auto friends_vec = builder.CreateVector(friends);

  auto root = CreatePerson(builder, name, age, friends_vec);

  // 构建最终缓冲区
  builder.Finish(root);
  auto buf = builder.GetBufferPointer();
  size_t size = builder.GetSize();

  // 保存到文件(可选)
  std::ofstream file("data.bin", std::ios::binary);
  file.write(reinterpret_cast<const char*>(buf), size);
  file.close(); 

  return 0;
}
}

4. 反序列化实现

#include "person_generated.h"
#include <fstream>
#include <cstdio>

int main() {
  // 读取二进制文件
  std::ifstream file("data.bin", std::ios::binary | std::ios::ate);
  if (!file.is_open()) {
    printf("Failed to open file.\n");
    return -1;
  }

  size_t size = file.tellg();
  char* buf = new char[size];
  file.seekg(0, std::ios::beg);
  file.read(buf, size);
  file.close();

  // 验证缓冲区
  flatbuffers::Verifier verifier(reinterpret_cast<const uint8_t*>(buf), size);
  if (!verifier.VerifyBuffer<Person>()) {
    delete[] buf;
    printf("Verification failed.\n");
    return -1;
  }

  // 直接访问数据
  const Person* person = GetPerson(buf);
  printf("Name: %s, Age: %d\n", person->name()->c_str(), person->age());

  // 遍历嵌套数据
  if (person->friends() != nullptr) {
    for (int i = 0; i < person->friends()->size(); ++i) {
      const Person* friend_person = person->friends()->Get(i);
      printf("Friend: %s\n", friend_person->name()->c_str());
    }
  }

  delete[] buf;
  return 0;
}

三、性能优化参数

1. 缓冲区管理
  • 初始容量FlatBufferBuilder(size_t)设置初始缓冲区大小,减少内存分配次数7
  • 内存对齐:通过FLATBUFFERS_MAX_BUFFER_SIZE控制对齐粒度
2. 数据结构优化
  • 字段ID:为每个字段分配唯一ID(如id: 1)确保兼容性4
  • 向量化处理:使用CreateVector替代动态数组,预分配空间
3. 编译选项
flatc --gen-name-strings --gen-mutable --cpp person.fbs 
  • --gen-name-strings:生成字段名称字符串(调试用)
  • --gen-mutable:允许修改已生成对象(谨慎使用)

四、典型应用场景

场景优势体现代码示例片段
网络通信减少带宽消耗(比JSON小30%)SendBuffer(builder.GetBufferPointer())
本地缓存加载速度提升6-10倍FileCache::Load("config.bin")
多线程数据共享避免拷贝提升线程间通信效率std::shared_ptr<void> data = builder.Release();

五、架构设计建议

1. 分层设计
+-------------------+
| 业务逻辑层         |
+-------------------+
          ↓
+-------------------+
| FlatBuffers封装层 |
| - 序列化工厂      |
| - 反序列化解析器  |
+-------------------+
          ↓
+-------------------+
| 网络/文件IO层     |
+-------------------+
2. 容错机制
// 数据校验
if (!person->Verify(verifier)) {
  LOG(ERROR) << "Invalid buffer format";
  return;
}

// 版本兼容
if (person->has_deprecated_field()) {
  LOG(WARNING) << "Deprecated field detected";
}

六、性能对比测试

格式序列化时间(ms)反序列化时间(ms)文件大小(KB)
FlatBuffers0.230.1815.7
JSON1.250.9842.3
ProtocolBuf0.450.3528.1

测试环境:Intel i7-10700K, 16GB RAM, 数据集包含1000个嵌套对象


完整代码

Github

作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

相关文章:

  • ngx_set_worker_processes
  • 考研数据结构之串的模式匹配算法——KMP算法详解(包含真题及解析)
  • 回顾CSA,CSA复习
  • Linux的网络配置的资料
  • python对mysql数据库的操作
  • 深度学习中多机训练概念下的DP与DDP
  • C++ 编程指南35 - 为保持ABI稳定,应避免模板接口
  • SQL查询语句的执行顺序
  • C++(初阶)(十一)——list
  • 数据结构实验6.1:矩阵的螺旋方阵输出
  • 在ArcGIS Pro中将栅格NoData值修改为特定值
  • QEMU源码全解析 —— 块设备虚拟化(19)
  • 【项目管理】第12章 项目质量管理-- 知识点整理
  • JavaScript 输入输出语句
  • Docker 部署 Kafka 完整指南
  • 系统编程3(共享内存/信号量)
  • 【数据结构与算法】——堆(补充)
  • 人的需求更多是动物本能—观《枪王》
  • 计算视觉与数学结构及AI拓展
  • 【家政平台开发(41)】家政平台性能蜕变:性能测试与优化全解析
  • 福建省委副秘书长、政研室主任郭国云已赴厦门履新
  • 马上评|把孩子当牟利工具,这样的流量吃不得
  • 中国海警就菲向非法“坐滩”仁爱礁军舰运补发表谈话
  • 海南征集民生领域涉嫌垄断违法行为线索,包括行业协会等领域
  • A股高开高走:宠物经济走强,超3800股收涨,两市成交超1.1万亿元
  • 美国前驻华大使携美大学生拜访中联部、外交部