flatbuffer编译与使用
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] | 数组 |