FlatBuffers:高效利用内存的序列化函数库

flatbuffers

FlatBuffers 是一个高性能而且跨平台的序列化类库,它能够兼容C++、C#、Java、JavaScript、PHP和Python(C和Ruby也即将被兼容)。FlatBuffers最早是被Google开发出来的,用在游戏开发和其他对性能要求很高的应用上。

FlatBuffers目前已经在Github上开源,获得了Apache的授权(内容请看LICENSE.txt)。

为何选择FlatBuffers?

  • 无需解析与拆包的序列化 ——  FlatBuffers最独到的地方,就是它将层级化的数据结构扁平化为了二进制流数据,所以解析与拆包等工作便全无必要了。当然,FlatBuffers同样也支持对数据结构的变化(向上向下兼容)。
  • 高性能与低内存占用 —— 读取数据所需要的内存仅仅就是这些二进制流的大小,除此之外,不再需要其他的内存申请操作。FlatBuffers与mmap(或者流操作)的配合使用非常好,而且整个过程的内存占用大小仅仅只相当于部分数据流的大小。除开在处理格式变化与可选字段的时候,会有唯一的一段额外开销以外,其他的数据处理时间都快到接近于处理原生数据的时间。FlatBuffers 重点针对那些在获取与构建序列化数据时花费过多的时间与空间(大量内存分配)的应用,比如游戏与其他性能敏感性应用程序。点击这里去查看Benchmarks上的测试结果。
  • 灵活性 —— 在FlatBuffers里,数据的属性是非必须的,是可选择的,所以意味着向上与向下兼容都是大可放心的(这表示,对于一个长久持续运营的游戏来说,升级新版本的时候是不需要更新全部数据的!)。而且,这也表明开发者有很大的空间去决定哪些数据是你要加的,哪些是不要的,甚至还可以自己设计更合适的数据结构。
  • 轻量级 ——  FlatBuffers的代码量很小,而且也最大限度地降低了环境依赖,这使得项目与FlatBuffers的整合更加方便。好了,感兴趣的话,再去看看Benchmark的具体数据吧。
  • 强类型 —— 如果你的编码有误,那么错误在编译期间就会明确出现,而不是要等到运行时才能发现。FlatBuffers会帮你生成很多有用的代码。
  • 使用方便 ——生成的C++代码提供了简单的访问和构造接口;如果需要,而且还可以选择相应的函数来在运行时高效解析Schema和类JSON格式的文本(性能远超其他JSON解析器)。Java和Go的代码支持对象重用,C#也有高效的数据结构生成器。
  • 跨平台而且无依赖性 —— C++ 代码,包括test和samples,都可以在最近的任意gcc/clang版本上运行,同时也包括VS2010。

快速上手

接下来将会简要介绍如何使用FlatBuffers。

  • 首先,为你要进行序列化操作的数据结构编写一个schema文件。在定义数据结构的属性时,你可以使用基本类型(各种长度的整形与浮点型),也可以是一个字符串,一个任意类型的数组,一个自定义的对象,甚至是一个自定义对象的集合(unions)。属性的值都是允许为空的,同时也可以设置默认值,所以这样一来,每个构建的对象可以根据自己的需要设置属性值。
  • 然后,用flatc命令(FlatBuffer的编译器)去生成一个C++头文件(或者生成Java/C#/Go/Python等等其他语言的相关文件),进而通过相应的辅助类文件来构建序列化数据。这个生成的C++头文件(比如 mydata_generated.h)只依赖flatbuffers.h,顺便补充一句,flatbuffers.h里包含了很多核心的函数。
  • 接着,使用FlatBufferBuilder类去构建一个单层级的二进制流数据。通过之前flatc命令生成好的代码以及FlatBufferBuilder的使用,简单的一些函数调用,就可以让你很自如地向二进制流中加入对象。
  • 好了,是时候将生成的二进制数据存起来了!或者,你是在做网络通信,那就它这些数据传输出去吧!
  • 当然,从另一个角度来说,当你获取到二进制数据,要将他解析成对象的时候,你可以将数据指针指向它的根对象,然后你可以在需要的位置方便地将它进行转换,获取你要的属性(object->field())。

开发资源

网络资源

测试案例

在Google的Benchmark中,已经明确表明了其性能优势,杠杠的啊!

考虑到其扩语言与轻量级的特性,笔者专门自己做了一些较为贴近生产场景的测试,对比的是开发常用的1.1.41版本的fastjson

贴上代码

结果是,还是有点差距的:

下面是多次测试后的结果统计:

执行次数\执行时间(毫秒) 100 1000 10000 100000 1000000 10000000
FlatBuffers 1 1 15 30 42 209
fastjson 186 283 405 639 2353 16998

 

官方网站:http://google.github.io/flatbuffers/
开源地址:https://github.com/google/flatbuffers

打赏支持我整理更多优质资源,谢谢!

打赏编辑

打赏支持我整理更多优质资源,谢谢!

任选一种支付方式

1 收藏

资源整理者简介:凝枫

非典型性程序员,爱做一些和写程序毫不相干的事 个人主页 · 贡献了46个资源 · 1


直接登录

推荐关注

按分类快速查找

关于资源导航
  • 伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1440 项工具资源。
    推送伯乐头条热点内容微信号:jobbole 分享干货的技术类微信号:iProgrammer