1、什么是flatBuffer:

FlatBuffers为Google发布的一个跨平台,提供多种语言接口,注重性能和资源使用的序列化类库。目前该类库提供C++, C#, C, Go, Java, JavaScript, PHP, and Python语言接口。该序列化类库多用于移动端手游数据传输以及特定的对性能有较高要求的应用。 接下来我们将学习FlatBuffers环境搭建并且使用PHP语言完成一次简单的序列化例子。

  • 编译flatc工具
  • 编写一个FlatBuffers的scheme文件
  • 使用flatc工具编译scheme文件,生成对应语言的数据对象头文件/类
  • 使用FlatBufferBuilder序列化对象
  • 反序列化数据对象

2、安装:

编译工具flatc工具,首先要先装Cmake(推荐apt-get install cmake) (1)下载FlatBuffers源码,从gitHub上下载项目源代码:

git clone https://github.com/google/flatbuffers.git

(2)进入flatbuffers项目根目录,输入如下命令

cmake -G "Unix Makefiles" //生成MakeFile make //生成flatc make install //安装flatc

(3)查看flatc,如下图

flatc --version

3、编写FlatBuffers的scheme文件:

	 // Example IDL file for our monster's schema.
		namespace com.zeyuan.learning;
		enum Color:byte { Red = 0, Green, Blue = 2 }
		union Equipment { Weapon } // Optionally add more tables.
		struct Vec3 {
			x:float;
			y:float;
			z:float;
		}
		table Monster {![](http://i2.51cto.com/images/blog/201805/30/176b5bec853b087070ba6afba8905488.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
			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.
		}
		table Weapon {
			name:string;
			damage:short;
		}
		root_type Monster;
		```
 
 ### 4、编译Schema文件:
 
 - 将上节编写的scheme文件保存为test.fbs文件,到该文件所在文件夹下,执行
 
  >   flatc [ GENERATOR OPTIONS ] [ -o PATH ] [ -I PATH ] [ -S ] FILES…  [ – FILES…]

定义文件按照顺序被读取和编译,还可以包含其他定义文件和数据(详情 见下面).
任意个定义文件可能生成一个或者多个定义文件,这取决于附加的命令选项 
>- --cpp,-c :按照定义生成C++头文件 
- --java,-j :按照定义生成Java代码 
- --csharp,-n :按照定义生成C#代码 
- --go,-g :按照定义生成Go代码 
- --python,-p :按照定义生成python打底吗 
- --javascript,-s :按照定义生成JavaScript 
- --php :按照定义生成php 
数据序列化格式选项 
- --binary,-b :序列化成.bin 后缀的二进制格式, 
- --json,-t :序列化成.json 后缀的json格式, 
其他选项 
- -o PATH :输出搜有生成的文件到Path(绝对路径,或者相对于当前目录)路径,如果省略,Path就是当前目录.路径末尾因该是你的系统分隔符\或者/. 
- -I PATH :当遇见include声明,试图读取文件的时候将从此路径按照顺序查找,如果失败,就按照相对路径查找 
- -M :打印Make规则到生成文件 
- --strict-json :要求生成严格的json文件(名字等字段包含在引号中,table和Vector末尾没有逗号),默认 在required/generated时没有引号,末尾逗号是允许的 
- ---defaults-json :当输出json文件本的时候输出字段等于默认值 
- ---no-prefix :当生成C++头文件时 枚举值不包含枚举类型的前缀 
- ---scoped-enums :使用C++11风格作用域和强类型枚举生成C++,也就意味着 --no-prefix 
- ---no-includes :不生成包含include模式的代码,(依赖C++) 
- ---gen-mutable :为可变的FlatBuffers生成额外的non-const访问器 
- ---gen-onefile :生成一个定义文件(用于C#)

执行以下代码:
> flatc --php  test.fbs

将会生成php语言的类文件定义,如果你想为别的语言生成相应的类文件可查看以上选项,如图。

![](http://i2.51cto.com/images/blog/201805/30/d17a13cba6f8736289fbb1c7ecf0376a.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
参考:
1.如何写Scheme:https://google.github.io/flatbuffers/flatbuffers_guide_writing_schema.html
2.flatc编译说明:https://blog.csdn.net/u010893023/article/details/50470835
3.flat安装教程:https://www.jianshu.com/p/8df23cd182ec