一.什么是FlatBuffers
FlatBuffers是Google开发的一个开源的,跨平台的,高效的,提供
C++/Java/Go/C#接口支持的序列化工具库。
Github上的代码托管地址: https://github.com/google/flatbuffers
项目介绍主页: http://google.github.io/flatbuffers/index.html
二.FlatBuffers的优点
1.对序列化数据的访问不需要打包和拆包—-它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而没有任何解析开销;
2.内存效率和速度——访问数据时的唯一内存需求就是缓冲区,不需要额外的内存分配。 这里可查看详细的.
3.扩展性、灵活性——它支持的可选字段意味着不仅能获得很好的前向/后向兼容性
4.最小代码依赖——仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。再次,看基准部分细节;
5.强类型设计——尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正;
6.使用简单——生成的C++代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本;
7.跨平台——支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好;
三.如何在Android中使用FlatBuffers
- 将JSON数据在应用外的某一个地方转换成FlatBuffers格式的数据,(比如:将二进制数据以文件的形式提交,还可以从API直接返回FlatBuffer二进制文件)
- 在flatc(FlatBuffers编辑器)的帮助下,手动生成数据模型。(Java类)
- JSON文件存在一定的局限性(比如不能使用null字段,日期格式被认为是字符串类型)
总结:
什么使得Flatbuffers如此奏效?
- 由于是以二进制形式缓存,访问序列化数据时也无需数据解析过程。
- Flatbuffers数据不需要分配比自身使用缓冲区还要多的内存。我们不必像在JSON中那样为解析数据的整个层次分配额外对象。
- 正是利用自身特殊的编码格式,能一定程度上减少内存的占用,优化读取的性能。更重要的是,对于数据结构的向前向后兼容提供了很好的扩展性,方便又高效:要想让数据结构具有可扩展性,需将数据结构定义为table,它是数据扩展的基础,FlatBuffers中的struct类型不支持扩展
- 如果想在后续的版本中删除数据结构中的某些字段,只要在将要删除的字段后面添加(deprecated)即可,当然需要保证删除的字段在之前版本的程序中不会引起程序崩溃(该删掉的字段在上一版本的程序中获取到的会是个空指针或空值,只需保证程序在获取到空值或空指针之后不会出现异常即可
- 如果想在后续版本中向数据结构中添加某些字段,需添加到table中最后一个字段的后面,若是想table中随意位置添加字段,需如上面TextureData 的定义,给每个字段指明添加id:n(n从0开始)
参考:
http://www.csdn.net/article/2015-08-31/2825579
http://www.jianshu.com/p/6eb04a149cd8
https://google.github.io/flatbuffers/index.html