[FlatBuffer系列介绍]https://www.jianshu.com/p/a110390a65fa
FlatBuffer原理介绍
FlatBuffer性能原理介绍
FlatBuffer使用介绍
一、FlatBuffer的优点和缺点
优点
1.对序列化数据的访问不需要打包和拆包——它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而没有任何解析开销;
2.内存效率和速度——访问数据时的唯一内存需求就是缓冲区,不需要额外的内存分配;
扩展性、灵活性——它支持的可选字段意味着不仅能获得很好的前向/后向兼容性(对于长生命周期的游戏来说尤其重要,因为不需要每个新版本都更新所有数据);
3.最小代码依赖——仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。
4.强类型设计——尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正;
5.使用简单——生成的C++代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本;
6.跨平台——支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好。
缺点
定义数据结构相对麻烦
数据的可读性没有json好
构建可序列化对象很麻烦
需要使用工具生成Java代码
二、FlatBuffer的原理
参考
参考
简单的来说就是把对象数据,保存在一个一维的数组中。FlatBuffer将数据都缓存在一个ByteBuffer中,每个对象在数组中被分为两部分。元数据部分:负责存放索(索引相对于中间部分开始记录)。真实数据部分:存放实际的值。分割的节点为(pivot point)。它的将数据以及对应的数据位置都保存在一个线性的数组中。使用的时候只需要把byte流发送出去,解析的时候只需要根据保存的位置,截取对应的数值即可。
例子:
假设我们创建了一个Person对象,它的name是John,friendshipStatus是2.那么对应图中元数据部分第一个byte是1--->从中心点处数一个位置,开始的字符就是name的值即john。第二个byte是6,从中心点数6个位置值是2.
class Person {
String name;//john
int friendshipStatus;//2
Person spouse;
Listfriends;
}
三、FlatBuffer搭建环境
在mac环境下。
1.首先最好安装了Xcode
2.安装Cmake
3.下载Flatbuffer源码
4.使用cmake编译项目
可以使用可视化界面,也可以使用命令
cmake -G "Unix Makefiles"
5.使用make指令编译项目
6.使用make install命令生成flatc文件
如果一切顺利生成如下的文件,这里的flatc就是可以编译的文件,如果make install 不顺利,那么直接将这个文件拖入控制台也可以使用。
遇见的问题
xcrun: error: invalid active developer path, missing xcrun
没有安装xcode
xcode-select --install
no permission
makeinstall遇见了问题,不能正常安装
sudo make install
Android环境下使用FlatBuffer
1.首先定义Scheme
Scheme代表要接收的数据结构,后缀是fbs
2.使用flatc将scheme生成要使用的java文件
3.将生成的java文件考入到项目中
namespace com.efrobot.robot;
table Module{
module_id:long;
module_name:string;
action_name:string;
data_extra_name:string;
controlType:int;
overcurrent_time:int;
message_id:int;
data:data;
}
table data{
wheel:wheel;
}
table wheel{
direction:string;
speed:int;
}
root_type Module;
/Users/apple/Desktop/flatc -o /Users/apple/Desktop/workspace/opensource/flatbuffers/out -j /Users/apple/Desktop/workspace/opensource/flatbuffers/data/name.fbs
4.在gradle中引入工具
compile 'com.github.davidmoten:flatbuffers-java:1.9.0.1'
5.使用生成的Java文件构建数据模型
1.使用start方法表示开始构建
2.使用end方法表示结束构建
3.因为Flatbuffer不仅记录数据,还记录索引,所以如果是string类型的数据,需要特殊的createString方法记录值,并且拿到返回的索引位置
4.如果要创建的是一个对象,使用对应的对象类的create方法来创建这个对象,并记录它的索引值。
5.使用FlatBufferBuilder的finish方法结束构建
6.用sizedByteArray方法获得数据流
7.数据解析的时候只需通过getRoot方法将buffer方法转换为对象即可
8.通过对象.的形式获取数据源