FlatBuffers 是一个序列化开源库,主要由 Wouter van Oortmerssen 编写,并由 Google 开源.

它可以用做数据的结构化存储也可以做为结构化的数据传输。

针对高性能目标我选择C库实现

$ git clone https://github.com/dvidelabs/flatcc

编译

$ cd flatcc/
$ ./scripts/initbuild.sh make
$ mkdir -p ../fbproject/3rd/flatcc
$ ./scripts/setup.sh -a ../fbproject/3rd/flatcc ;这里只能使用相对路径
; $ scripts/setup.sh -s -x ../foobar 不重新编译直接创建一个项目
$ ls bin
$ ls lib
$ cd ../fbproject/3rd/flatcc
$ ls src ;这个目录下是你的schema定义 ?.fbs 和代码 *.c
$ ./scripts/build.sh ;编译
$ ls generated

Bugs

详页

使用

  • 因为这个C库的文档很少,例子也不多,初学比较困难,所以我把自己的学习经验整理如下。

flatbuffer在内存大小上并没有进行做极限优化,更多是在性能优化上,特别是解包的零内存消耗非常好。 关于默认值:默认值的作用是当取值为默认值时,包内存中将并不占用内存空间存储值,也就是将减小包大小。

从源码中学习

先用三个最基本的数据类型来举例

namespace wii;

table Packet {
  a:int;
  b:bool;
  c:string;
}

root_type Packet;

经过flatcc -o将生成如下5个头文件

也可以使用flatcc –outfile将这5个头文件合并成一个

文件 说明
example_builder.h 构建代码
example_verifier.h 校验代码
example_reader.h 解析代码
flatbuffers_common_builder.h 公共构建代码
flatbuffers_common_reader.h 公共解析代码

例子

例子 说明
bugreport 自定义file_identifier与导出码流的几种方式
emit_test flatcc_builder_custom_init

数据类型

类型 名称 说明
table 定义对象的主要方式,其中每个字段都是可选 optional 的.
struct 结构  
union 集合  
emun 枚举  
[array] 数组