FlatBuffers簡(jiǎn)單了解

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容