博客
关于我
TFLite: flatbuffers
阅读量:766 次
发布时间:2019-03-23

本文共 2675 字,大约阅读时间需要 8 分钟。

FlatBuffers 是一个开源 序列化 库,提供与 Protocol Buffers、Thrift、Apache Avro 等类似的序列化格式。它由 Wouter van Oortmerssen 开发,后由 Google 开源,主要用于 Android 游戏和注重性能的应用。FlatBuffers 支持多种语言的端口,包括 C++、C#、C、Go、Java、PHP、Python 和 JavaScript。

FlatBuffers 的核心特点

FlatBuffers 是一个二进制 buffer,它通过 offset 组织嵌套对象(如 struct、table、vector 等),允许直接访问数据与传统指针方式类似。然而,大多数内存结构与 FlatBuffers不同,后者采用严格的对齐规则和字节顺序,以确保跨平台兼容。此外,table 对象支持前向/后向兼容性和 optional 字段,方便应对数据格式的演变。

FlatBuffers 的主要优势在于避免反序列化。通过定义二进制数据协议,FlatBuffers 将数据直接转换为二进制格式,无需额外的反序列化步骤。与传输 JSON 的流程相比,FlatBuffers 的二进制文件可以直接读取和解析,显著提高性能。

FlatBuffers 的数据类型

FlatBuffers 支持基本类型和复杂类型:

  • 基本类型

    • 8 位:byte、ubyte、bool
    • 16 位:short、ushort
    • 32 位:int、uint、float
    • 64 位:long、ulong、double
  • 特殊类型

    • SOffsetT(有符号 offset,size = 4)
    • UOffsetT(无符号 offset,size = 4)
    • VOffsetT(vtable 无符号 offset,size = 2)
  • 复杂类型

    • 数组(用 [type] 表示,不支持嵌套数组)
    • 字符串(支持 UTF-8 或 7-bit ASCII,可用 [byte] 或 [ubyte] 表示其他编码)
    • Struct(支持基本类型或嵌套 Struct)
    • Table(最灵活且最常用的类型,支持多种类型)

如何安装 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 的示例代码

    以下是 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

    生成的文件:test_generated.h

    #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;  }

    注意事项

    • 数据类型的默认值规则:标量类型可设默认值,非标量(如 string、vector、table)字段默认不存在时为 null。
    • table 最为灵活且常用,适合复杂数据结构。

    通过以上步骤,您可以成功使用 FlatBuffers 进行数据序列化与反序列化,优化应用的性能表现。

    转载地址:http://cjuzk.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>