[TOC]

文章参考:https://google.github.io/flatbuffers/usergroup0.html

概述

文章参考:https://google.github.io/flatbuffers/index.html#flatbuffers_overview

FlatBuffers 是一个序列化开源库,实现了与 Protocol Buffers,Thrift,Apache Avro,SBE 和 Cap’n Proto 类似的序列化格式,主要由 Wouter van Oortmerssen 编写,并由 Google 开源。Oortmerssen 最初为 Android 游戏和注重性能的应用而开发了FlatBuffers。现在它具有C ++,C#,C,Go,Java,PHP,Python 和 JavaScript 的端口。

FlatBuffer 是一个二进制 buffer,它使用 offset 组织嵌套对象(struct,table,vectors,等),可以使数据像任何基于指针的数据结构一样,就地访问数据。然而 FlatBuffer 与大多数内存中的数据结构不同,它使用严格的对齐规则和字节顺序来确保 buffer 是跨平台的。此外,对于 table 对象,FlatBuffers 提供前向/后向兼容性和 optional 字段,以支持大多数格式的演变。

FlatBuffers 的主要目标是避免反序列化。这是通过定义二进制数据协议来实现的,一种将定义好的将数据转换为二进制数据的方法。由该协议创建的二进制结构可以 wire 发送,并且无需进一步处理即可读取。相比较而言,在传输 JSON 时,我们需要将数据转换为字符串,通过 wire 发送,解析字符串,并将其转换为本地对象。Flatbuffers 不需要这些操作。你用二进制装入数据,发送相同的二进制文件,并直接从二进制文件读取。

尽管 FlatBuffers 有自己的接口定义语言来定义要与之序列化的数据,但它也支持 Protocol Buffers 中的 .proto格式。

在 schema 中定义对象类型,然后可以将它们编译为 C++ 或 Java 等各种主流语言,以实现零开销读写。FlatBuffers 还支持将 JSON 数据动态地分析到 buffer 中。

除了解析效率以外,二进制格式还带来了另一个优势,数据的二进制表示通常更具有效率。我们可以使用 4 字节的 UInt 而不是 10 个字符来存储 10 位数字的整数。

它在 Apache 许可证 v2 下以开源形式在GitHub 上提供(请参阅 LICENSE.txt)。

优点

源码编译

Building with CMake

源码下载:https://github.com/google/flatbuffers

我们下载下载的版本:https://github.com/google/flatbuffers/releases/tag/v22.10.26

下载的本地目录:/Users/frewen/03.ProgramSpace/15.CLang/03.Source/flatbuffers-22.10.26

编译步骤:

我们先基于MacOS环境进行编译:

1
2
3
4
5
6
7
8
9
10
11
12
# 进入下载的源码目录:
mkdir build
cd build
# 生成MakeFile
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ..
cmake -G "Visual Studio 10" -DCMAKE_BUILD_TYPE=Release ..
cmake -G "Xcode" -DCMAKE_BUILD_TYPE=Release ..
# 源码编译,生成flatc,如下图
make
# 安装flatc,默认安装在MacOS系统的/usr/local/bin/flatc目录下
make install

image-20221119172420860

测试安装的环境:

1
2
3
4
5
6
7
8
# 查看版本号
(base)frewen@FreweniMacBookPro ~/03.ProgramSpace/15.CLang/03.Source/flatbuffers-22.10.26/build ~ flatc --version
flatc version 22.10.26
# 查看flatc的位置
where flatc
/usr/local/bin/flatc
/usr/local/bin/flatc
./flatc

接入指南