這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
[TOC]
定義 IDL 模型檔案
FlatBuffers的模型介面定義檔案尾碼為 .fbs
fbs 文法
基礎文法
語句使用 ;
結尾
結構體使用 {}
來限定
使用 []
來指定一個自訂類型
範例
namespace com.my.event;table Event{ touch : [Touch];}table Touch{ x : int(id: 0); y : int(id: 1);}root_type Event;
關鍵字
關鍵字 |
描述與用途 |
/// |
FlatBuffers中用 "///" 來表示注釋,且此注釋會帶入到產生的源碼檔案中 |
namespace |
模型目錄,包結構 |
table |
模型類標識 會產生對應標識的單個模型檔案的類 |
bool short int float string |
預設資料類型關鍵字 |
enum |
枚舉類資料定義 |
union |
產生一個獨立的枚舉類 |
deprecated |
指定deprecated,可以刪除掉此欄位 |
priority |
設定優先權 |
root_type |
其table產生的檔案中,除Table中欄位會產生相關函數外會另外產生GetRootAsXXX()的函數 |
required |
struct的每個欄位都為required,table的每個欄位都預設都是optional,但可以指定為required |
id |
設定產生指定順序,要求這個table裡面全部都寫上才生效 |
include |
引入另一個fbs內容 |
範例
namespace MyGame;attribute "priority";enum Color : byte { Red = 1, Green, Blue }///union Any { Monster, Weapon, Pickup }//union Any { Monster}union Any { Monster, Weapon}struct Vec3 { x:float; y:float; z:float;}/// 注釋table Monster { pos:Vec3; mana:short = 150; hp:short = 100; name:string; friendly:bool = false (deprecated, priority: 1); inventory:[ubyte]; color:Color = Blue; test:Any;}table Weapon { pos:Vec3; mana:short = 150;}root_type Monster;root_type Weapon;
fbs 技巧
///直接嵌套structtable Monster { pos:Vec3; ...}/// 直接指定資料類型及預設值mana:short = 150;/// 指定deprecated,可以刪除掉此欄位friendly:bool = false (deprecated, priority: 1);/// 加id指定產生順序mana:short = 150 (id: 3); /// include "include_test1.fbs"; 形式,將其它.fbs檔案嵌套進來
如有加id,則table中所有欄位都要加id才可通過
產生對應語言的模型檔案
使用 flatc
產生對應語言的模型檔案
--cpp -c Generate C++ headers for tables/structs. --go -g Generate Go files for tables/structs. --java -j Generate Java classes for tables/structs. --js -s Generate JavaScript code for tables/structs. --csharp -n Generate C# classes for tables/structs. --python -p Generate Python files for tables/structs. --php Generate PHP files for tables/structs.
flatc -g Test.fbs
自動更新模型檔案指令碼
#!/usr/bin/env bashrm -rf flatbuffermkdir -p flatbuffer/javamkdir -p flatbuffer/gocd flatbuffer/javaflatc -j ../SimulationEvent.fbscd ..cd goflatc -g ../SimulationEvent.fbs
更新指令碼是一個範例,建議自己修改~
golang 項目中使用
安裝golang支援包
go get -u -v google/flatbuffers/go
golang官方使用Flatbuffers文檔 http://google.github.io/flatbuffers/index.html
或者 根據範例來使用
https://github.com/google/flatbuffers/tree/master/samples
java使用 (Android中也一樣)
引入依賴庫
dependencies { compile 'com.github.davidmoten:flatbuffers-java:1.3.0.1'}
按照例子使用
https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.java