FlatBuffers简单了解

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

你可能感兴趣的:(FlatBuffers简单了解)