1、FlatBuffers 环境搭建
1、Cmake安装
1.1、查看是否安装cmake
cmake --version
.1.2、Mac安装cmake 方法一:推荐Homebrew自动安装 Homebrew简介 * 是否安装brew * brew —version * 安装brew只需要一条命令即可:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew常用命令
1 搜索软件:brew search 软件名,如brew search wget
2 安装软件:brew install 软件名,如brew install wget
3 卸载软件:brew remove 软件名,如brew remove wget
cmake具体安装
* 第一步:brew search cmake
* 第二步:brew install cmake
* 第三步:cmake –version 方法二:手动下载安装 前往 cmake 官网,下载Mac操作系统对应的安装包。
2、编译生成 flatc 工具
2.1前往 flatbuffers 下载源码https://github.com/google/flatbuffers
2.2前往本地 flatbuffers 根目录下,输入如下命令:
cmake -G "Unix Makefiles"
2.3稍等一会cmake就完成了MakeFile的生成,接下来运行:
make
2.4开始编译,稍等一会编译成功后会在根目录下生成flatc工具。 接下来我们使用
make install
2.5该命令,安装flatc,该命令将flatc工具拷贝到/usr/local/bin/目录下(环境配置不同可能有所不同),重新启动终端输入
flatc --version
flatc version 1.11.0
完成了flatc工具的编译和安装。
3、编写FlatBuffers的scheme文件
官网demo地址https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html
// Example IDL file for our monster's schema.
namespace MyGame.Sample;//namespace定义了该scheme的命名空间
//使用enum关键字定义类枚举类型Color
enum Color:byte { Red = 0, Green, Blue = 2 }
//union定义共用体(C风格)
union Equipment { Weapon } // Optionally add more tables.
//struct定义了名为Vec3的结构体
struct Vec3 {
x:float;
y:float;
z:float;
}
//table定义了名为Monster复合类结构
table Monster {
pos:Vec3; // Struct.
mana:short = 150;
hp:short = 100;
name:string;
friendly:bool = false (deprecated);
inventory:[ubyte]; // Vector of scalars.
color:Color = Blue; // Enum.
weapons:[Weapon]; // Vector of tables.
equipped:Equipment; // Union.
path:[Vec3]; // Vector of structs.
}
table Weapon {
name:string;
damage:short;
}
//root_type指明Monster类为根类型
root_type Monster;
3.1schema文件说明:
namespace 命名空间就是使用编译器后生成的文件夹名,生成的类文件都放在此文件下
后缀格式fb都行
字段后面可跟默认值,如:id:int=0;
支持基本类型以及内置类型string。unions型使用字段table标识,table 后就是生成的类名。
必须有根类型使用root_type标明根类型。
4、编译scheme文件
将上面编写的scheme文件保存为monster.fbs文件,到该文件所在文件夹下,执行
flatc --java monster.fbs
2、iOS从零使用flatbuffers
如果我们通过 flatbuffers 官网下载的代码,并通过上面一系列的流程后,当走到使用 flatc 工具编译生成 特定的OC的 .h 和 .m 文件时候发现,生成失败。
./flatc -oc testFb.fbs.fbs
在github找到 FlatBuffers-ObjC 库
ReadME如下:
1. git clone [https://github.com/jidibingren/FlatBuffers-ObjC.git](https://github.com/jidibingren/FlatBuffers-ObjC.git)
2. open rootdir/FlatBuffer/build_ide/Xcode/FlatBuffers.xcodeproj and build flatc target
3. ./flatc -oc test.fbs
4. import the files into your project generated for step 3
5. add pod 'FlatBuffers-ObjC' to your Podfile
2.1、按照库的指引进行生成 flatc 工具
open rootdir/FlatBuffer/build_ide/Xcode/FlatBuffers.xcodeproj and build flatc target
会自动生成 flatc 工具
2.2、编译 scheme 文件
./flatc -oc testFb.fbs
OC文件 3.3、实际项目使用
4.FlatBuffers 原理
配图[https://www.jianshu.com/p/523968b82e74]
FlatBuffers 保存在一个 byte 数组中,有一个“支点”指针(pivot point)以此为界,存储的内容分为两个部分:元数据和数据内容。其中元数据部分就是数据在前面,其长度等于对象中的字段数量,每个 byte 保存对应字段内容在数组中的索引(从支点位置开始计算)。
如图,上面的 Person 对象第一个字段是 name,其值的索引位置是 1,所以从索引位置 1 开始的字符串,就是 name 字段的值 “John"。第二个字段是 friendshipStatus,其索引值是 6,找到值为 2, 表示 NotFriend。第三个字段是 spouse,也一个 Person 对象,索引值是 12,指向的是此对象的支点位置。第四个字段是一个数组,图中表示的数组为空,所以索引值是 0。
通过上面的解析,可以看出,FlatBuffers 通过自己分配和管理对象的存储,使对象在内存中就是线性结构化的,直接可以把内存内容保存或者发送出去,加载“解析”数据只需要把 byte 数组加载到内存中即可,不需要任何解析,也不产生任何中间变量。
demo地址:https://github.com/Cuiyanjun/flatbuffersDemo/tree/master/testDemo