• 1、flatbuffers简介
  • 2、flatbuffers VS JSON
  • 3、flatbuffers 使用

1、flatbuffers简介

flatbuffer是google的一个跨平台串行化库,开发这个最初是用在游戏项目中,github项目地址flatbuffersFlatBuffer提供了详细的使用文档,可以参考Google.github.io主页上的教程。

2、flatbuffers VS JSON

对于Json我们使用了这么长时间,目前几乎所有的数据传输格式都是Json,我们都知道Json是当今全服务平台的轻量级数据传输格式,Json量级轻,并且可读性强,使用友好却不过时,Json是语言独立的数据格式,但Json转换的时候却耗费较多的时间和内存,Facebook尝试过将所有的App中Json传输都换成使用Flatbuffers,而最终的效果可以参考一下这篇文章Improving Facebook's performance on Android with FlatBuffers,看起来这个确实很有前途。正如facebook展示的那样,遵循Android快速响应界面的16ms原则。

如果你想把项目中所有的Json都替换为flatbuffers,首先要确认项目中真的需要这个,很多时候对性能的影响是潜移默化的,相比而言数据安全更加重要。

下面介绍三个数据序列化的候选方案:

Protocal Buffers:强大,灵活,但是对内存的消耗会比较大,并不是移动终端上的最佳选择。
Nano-Proto-Buffers:基于Protocal,为移动终端做了特殊的优化,代码执行效率更高,内存使用效率更佳。
FlatBuffers:这个开源库最开始是由Google研发的,专注于提供更优秀的性能。

上面这些方案在性能方面的数据对比如下图所示:

Paste_Image.png

Paste_Image.png

为什么flatbuffers这么高效?

1.序列化数据访问不经过转换,即使用了分层数据。这样我们就不需要初始化解析器(没有复杂的字段映射)并且转换这些数据仍然需要时间。

2.flatbuffers不需要申请更多的空间,不需要分配额外的对象。

3、flatbuffers 使用

(1)生成flatc

在使用前我们需要先生成flatc,flatc用来将我们编写的fbs文件转换成Java文件,也可以转换成其他文件,但我们在这里并不关心。
编译FlatBuffers生成flatc,我使用的是CMake工具,我们要先安装cmake。
首先要查看我们的系统中是否安装了gcc和g++编译工具。通过下面两条指令查看。默认情况下是安装了的。

gcc -v
g++ -v

如果没有安装通过下面两条指令安装

yum install gcc
yum install gcc-c++

接下来就需要安装CMake,下载CMake源码进行编译安装

wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz
tar -zxvf cmake-3.5.2.tar.gz
cd cmake-3.5.2/
sh bootstrap
make
make install

cd到从git下载下来的文件夹,编译flatc程序

cd flatbuffers/
cmake -G "Unix Makefiles"
make

这样就生成了flatc,和一些其他的可执行文件。

(2)定义Schema,生成Java文件

flatBuffers使用Schema定义数据结构,下面是一个简单的示例。语法较为简单

namespace org.sample;
table People {name:string;age:int;
}
root_type People;

将文件命名为sample.fbs,然后通过flatc来编译这个Schema。

./flatc --java sample.fbs

会在目录下生成相关的java文件。

定义Schema:

类型支持:基本的数据类型,只有标量值可以有默认值,非标量(string/vector/table)字段默认不存在时为null。如果指定会报

error: default values currently only supported for scalars

的错误,如果想要指定String类型的默认值可以修改生成的Java文件,虽然不建议这么做。
默认值写法:

age : int = 4 ;
isMe : bool = false;

支持数组写法:

array : [string];

支持自定义数据类型

people : People;

但使用的数据类型必须在同一文件中定义。

(3)终于回到Android Stadio部分
在gradle中添加

 compile 'com.github.davidmoten:flatbuffers-java:1.3.0.1'

然后把刚才生成的People的Java问价添加到项目中。
准备活动完成,使用起来就比较方便了。
使用过程中,用到最多的是FlatBufferBuilder。

    FlatBufferBuilder builder = new FlatBufferBuilder(0);int sun = builder.createString("Sun");//下面向People中填充属性People.startPeople(builder);People.addName(builder, sun);People.addAge(builder, 18);int tom = People.endPeople(builder);builder.finish(tom);ByteBuffer buffer = builder.dataBuffer();People people = People.getRootAsPeople(buffer);textView.setText(people.name());

生成FlatBufferBuilder, new的方式传入的参数是内部缓冲区的初始大小。使用的非标量类型需要提前生成offset,offset时缓冲区中已编码的字符串开始的偏移量。添加属性前需要先调用类型的start,变量赋值是以add的方式,赋值完成后调用类型的end方法,然后builder的finish,最后转换成字节buffer用于传输。

取值时通过类型的getRootAs...(buffer)直接拿到对象。

引用:

https://www.jianshu.com/p/3504d4643dba

https://blog.csdn.net/zhaowei121/article/details/94737876

数据序列化与传输 Protocal Buffers 与flatbuffer选型对比相关推荐

  1. protocal buffers 官方文档学习

    protocal buffers 官方文档学习 文章目录 protocal buffers 官方文档学习 1.What are protocol buffers? 2.选择你喜欢的语言 3.怎么开始, ...

  2. 高效数据序列化的工具 FlatBuffers 的初体验

    2019独角兽企业重金招聘Python工程师标准>>> 1. 背景 最近在项目中需要使用一种高效数据序列化的工具.碰巧在几篇文章中都提到了FlatBuffers 这个库.特别是 An ...

  3. Protocal Buffers

    Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化.反序列化,常用于RPC 系统(Remote Procedure Call Protocol Syste ...

  4. Java实现数据序列化工具Avro的例子

    1.Avro简介 Avro是一个数据序列化的系统. 它可以提供: 1)丰富的数据结构类型 2)快速可压缩的二进制数据形式 3)存储持久数据的文件容器 4)远程过程调用RPC 5)简单的动态语言结合功能 ...

  5. python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)

    一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...

  6. 常用模块(数据序列化 json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  7. python pickle模块:数据序列化和反序列化

      pickle模块是python中数据序列化和反序列化的一个包,该模块提供了一套算法,用于对一个Python对象进行serializing(序列化为字符串)和de-serializing(从字符串构 ...

  8. kafka python框架_Python中如何使用Apache Avro——Apache的数据序列化系统

    了解如何创建和使用基于Apache Avro的数据,以实现更好,更有效的传输. 在这篇文章中,我将讨论Apache Avro,这是一种开源数据序列化系统,Spark,Kafka等工具正在使用该工具进行 ...

  9. 为什么要将数据序列化?

    写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定大数据理 ...

最新文章

  1. 最简单的http服务器实现
  2. java 可用内存_总可用内存java
  3. linux中ssh连接慢的一种解决方法
  4. when is valid from and valid to filled in SAP IBASE buffer table
  5. mysql数据转存到时序数据库_干货丨如何高速迁移MySQL数据到时序数据库DolphinDB...
  6. 随想录(uclibc的学习)
  7. Android10源码下载和编译(解锁/刷机)
  8. AdapterView与Adapter
  9. Web服务器常用分类
  10. 【Pygame小游戏】确实会玩—教你如何在”吃豆豆“上完美躺赢……(收藏起来偷偷学)
  11. python每天定时执行任务_Python设置定时任务
  12. Linux—添加开机启动
  13. GHGL项目-其他问题锦集
  14. 【推荐】两大APP与云账户红包SDK集成详情及Demon分享v
  15. 难得起了一个大早^_^
  16. maskrcnn_benchmark代码分析(2)
  17. 【成员故事】CSDN杨东杰:生态运营需要一个自己的圈子
  18. 防止XSS漏洞攻击常用解决方案
  19. 哪个版本的outlook好_未来版本的Outlook的阴影?
  20. matlab仿真磁滞回线,磁滞回线测量方法及Simulink仿真分析研究.pdf

热门文章

  1. nginx 服务器的响应头,隐藏HTTP请求响应头里的nginx版本号
  2. Luogu P2482 [SDOI2010]猪国杀
  3. html jquery 模板引擎,jquery template.js前端模板引擎
  4. 一致性算法之paxos(帕克索斯)算法
  5. INNER JOIN ... ON用法
  6. 机器学习:查准率和查全率
  7. 学习马士兵教育 GC and Tuning
  8. css实现图片自适应缩放的两种方法
  9. MATLAB im2double、double、mat2gray、im2uint8和uint8的区别及使用
  10. JAVA 中文名字转拼音