java flatbuffer jar_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;

}

fa999434776a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

三、FlatBuffer搭建环境

在mac环境下。

1.首先最好安装了Xcode

2.安装Cmake

3.下载Flatbuffer源码

4.使用cmake编译项目

可以使用可视化界面,也可以使用命令

cmake -G "Unix Makefiles"

5.使用make指令编译项目

6.使用make install命令生成flatc文件

如果一切顺利生成如下的文件,这里的flatc就是可以编译的文件,如果make install 不顺利,那么直接将这个文件拖入控制台也可以使用。

fa999434776a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

遇见的问题

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

fa999434776a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

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方法获得数据流

fa999434776a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

7.数据解析的时候只需通过getRoot方法将buffer方法转换为对象即可

8.通过对象.的形式获取数据源

fa999434776a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值