FlatBuffers学习笔记二
一.为什么要使用FlatBuffers
在传输数据的过程中,无论是使用xml,html,还是json等,最终都是直接对数据进行操作。在这中间都存在编码和解码的过程,
然而FlatBuffers是直接对数据进行操作,仅仅增加了VTable和偏移量两个实体
FlatBuffers的特点:简单,高效,便利。
简单:————首先定义好协议文件(schema),然后使用工具编译成源码文件,就可以直接调用源码的接口来操作数据。
效率高:————FlatBuffers数据在缓冲区内都是平整的,可以直接访问,
便利:————FlatBuffers的协议文件设计好后就可以直接发布,任何人拿到这个协议都可以编译成源码来对数据进行操作,这对团队开发很有利,另外,FlatBuffers不用担心协议文件设计不周全的问题,因为你可以随便在table中添加或者删除成员。
二.为什么不使用FlatBuffers
- 效率虽然高,但是太消耗内存;
- FlatBuffers传输的数据较大;
- FlatBuffers打包后其中的矢量数据不能随意的修改;
- FlatBuffers的union类型不支持大于256哥类型,
- FlatBuffers传输数据没有json,xml,html等那么直观,
三.FlatBuffers详解
FlatBuffers其实就是一个保存了一系列标量矢量的缓冲区,其中的标量矢量可以直接访问。但是,如果一旦数据缓冲区构建成功,就不能随便修改其中的矢量,除非矢量长度不大于构造时的长度,且矢量保存的不是【偏移量,否则会产生错误。
3.1标量
所有的整型变量和浮点变量都是标量,长度是固定的,
FlatBuffers中的偏移量也是标量,所以在构造后不能随便修改,
struct结构也可以当做标量来看待。
3.2矢量
字符串和数组是矢量,字符串是以‘\0’结尾的,矢量的开头必须是一个32位的长度,用来指明矢量的长度,这个长度不包括‘\0’和长度本身所占的空间。
四.数据结构
struct————是不可更改的结构;(访问速度快,不可占用内存小);
table————可以随意增加或者删除成员,是一个灵活的类型,
root type————一个顶级类型,
union————是一个重要的类型,是封包分支的重要方法。
如果想要支持大于256个类型,必须通过union+table+union这个方式来扩充;如下:
//第二层union
table T2_1_t{//分支1
A1:int;
}
table T2_2_t{//分支2
A2:int;
}
union U2_1_t{
T2_1_t,
T2_1_t
}
table T2_3_t{//分支3
A3:int;
}
table T2_4_t{//分支4
A4:int;
}
union U2_2_t{
T2_3_t,
T2_4_t
}
//第一层union
table T1_1_t{
u:U2_1_t(id:1);//注意,由于union的类型占一个id,所以这里是1,不是0,0已经默认分配给type了
}
table T1_2_t{
u:U2_2_t(id:1);//注意,由于union的类型占一个id,所以这里是1,不是0,0已经默认分配给type了
}
union U1_1_t{//可以至少支持多达256*256=65536个消息分支
T1_1_t,
T1_2_t
}
//应用,这个Table可以至少支持多达256*256=65536种内容
table T_t{
u:U1_1_t(id:1);//注意,由于union的类型占一个id,所以这里是1,不是0,0已经默认分配给type了
}
总结:
FlatBuffers构造数据总的来说有两种,标量和矢量(即固定长度数据和可变长度数据)
参考: