1、FlatBuffers 環(huán)境搭建
1、Cmake安裝
1.1、查看是否安裝cmake
cmake --version
.1.2、Mac安裝cmake 方法一:推薦Homebrew自動(dòng)安裝 Homebrew簡(jiǎn)介 * 是否安裝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 方法二:手動(dòng)下載安裝 前往 cmake 官網(wǎng),下載Mac操作系統(tǒng)對(duì)應(yīng)的安裝包。
2、編譯生成 flatc 工具
2.1前往 flatbuffers 下載源碼https://github.com/google/flatbuffers
2.2前往本地 flatbuffers 根目錄下,輸入如下命令:
cmake -G "Unix Makefiles"
2.3稍等一會(huì)cmake就完成了MakeFile的生成,接下來(lái)運(yùn)行:
make
2.4開(kāi)始編譯,稍等一會(huì)編譯成功后會(huì)在根目錄下生成flatc工具。 接下來(lái)我們使用
make install
2.5該命令,安裝flatc,該命令將flatc工具拷貝到/usr/local/bin/目錄下(環(huán)境配置不同可能有所不同),重新啟動(dòng)終端輸入
flatc --version
flatc version 1.11.0
完成了flatc工具的編譯和安裝。
3、編寫(xiě)FlatBuffers的scheme文件
官網(wǎng)demo地址https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html
// Example IDL file for our monster's schema.
namespace MyGame.Sample;//namespace定義了該scheme的命名空間
//使用enum關(guān)鍵字定義類枚舉類型Color
enum Color:byte { Red = 0, Green, Blue = 2 }
//union定義共用體(C風(fēng)格)
union Equipment { Weapon } // Optionally add more tables.
//struct定義了名為Vec3的結(jié)構(gòu)體
struct Vec3 {
? x:float;
? y:float;
? z:float;
}
//table定義了名為Monster復(fù)合類結(jié)構(gòu)
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文件說(shuō)明:
namespace 命名空間就是使用編譯器后生成的文件夾名,生成的類文件都放在此文件下
后綴格式fb都行
字段后面可跟默認(rèn)值,如:id:int=0;
支持基本類型以及內(nèi)置類型string。unions型使用字段table標(biāo)識(shí),table 后就是生成的類名。
必須有根類型使用root_type標(biāo)明根類型。
4、編譯scheme文件
將上面編寫(xiě)的scheme文件保存為monster.fbs文件,到該文件所在文件夾下,執(zhí)行
flatc --java monster.fbs
2、iOS從零使用flatbuffers
如果我們通過(guò) flatbuffers 官網(wǎng)下載的代碼,并通過(guò)上面一系列的流程后,當(dāng)走到使用 flatc 工具編譯生成 特定的OC的 .h 和 .m 文件時(shí)候發(fā)現(xiàn),生成失敗。
./flatc -oc testFb.fbs.fbs
在github找到 FlatBuffers-ObjC 庫(kù)
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、按照庫(kù)的指引進(jìn)行生成 flatc 工具
open rootdir/FlatBuffer/build_ide/Xcode/FlatBuffers.xcodeproj and build flatc target
會(huì)自動(dòng)生成 flatc 工具
2.2、編譯 scheme 文件
./flatc -oc testFb.fbs
OC文件 3.3、實(shí)際項(xiàng)目使用
4.FlatBuffers 原理
配圖[http://www.itdecent.cn/p/523968b82e74]
FlatBuffers 保存在一個(gè) byte 數(shù)組中,有一個(gè)“支點(diǎn)”指針(pivot point)以此為界,存儲(chǔ)的內(nèi)容分為兩個(gè)部分:元數(shù)據(jù)和數(shù)據(jù)內(nèi)容。其中元數(shù)據(jù)部分就是數(shù)據(jù)在前面,其長(zhǎng)度等于對(duì)象中的字段數(shù)量,每個(gè) byte 保存對(duì)應(yīng)字段內(nèi)容在數(shù)組中的索引(從支點(diǎn)位置開(kāi)始計(jì)算)。
如圖,上面的 Person 對(duì)象第一個(gè)字段是 name,其值的索引位置是 1,所以從索引位置 1 開(kāi)始的字符串,就是 name 字段的值 “John"。第二個(gè)字段是 friendshipStatus,其索引值是 6,找到值為 2, 表示 NotFriend。第三個(gè)字段是 spouse,也一個(gè) Person 對(duì)象,索引值是 12,指向的是此對(duì)象的支點(diǎn)位置。第四個(gè)字段是一個(gè)數(shù)組,圖中表示的數(shù)組為空,所以索引值是 0。
通過(guò)上面的解析,可以看出,F(xiàn)latBuffers 通過(guò)自己分配和管理對(duì)象的存儲(chǔ),使對(duì)象在內(nèi)存中就是線性結(jié)構(gòu)化的,直接可以把內(nèi)存內(nèi)容保存或者發(fā)送出去,加載“解析”數(shù)據(jù)只需要把 byte 數(shù)組加載到內(nèi)存中即可,不需要任何解析,也不產(chǎn)生任何中間變量。
demo地址:https://github.com/Cuiyanjun/flatbuffersDemo/tree/master/testDemo