Google序列化库FlatBuffers 1.1发布,及与protobuf的比较

简介: Google序列化库FlatBuffers 1.1发布,及与protobuf的比较

个人总结:


FlatBuffer相对于Protobuffer来讲,优势如下:


1. 由于省去了编解码的过程,所以从速度上快于Protobuffer,个人测试结果100w次编解码,编码上FlatBuffer 优势不明显,解码上优势明显

2. FlatBuffer的格式文件定义上比Protobuffer格式更丰富

3. 使用方便,直接一个头文件就能搞定,这点很赞

 

劣势:


1. FlatBuffer的使用上不如Protobuffer方便,创建类型多了一次转换,这和FlatBuffer提升性能有关

2. FlatBuffer的格式定义文件比较灵活,不如Protobuffer直观性好

3. 目前项目的稳定度上略为欠缺,Github上issuse还不少

 

另外:


1. FB中的Table中field都为optional,可以指定default value,如果not optional and  no defaults,可以使用struct

2. PB中定义message的时候可以使用opitional和required 进行指定

 

如果对于性能没有迫切要求和通信消息量不大的情况,两者都可以选择。

 

FlatBuffers 1.1版本下载地址:

https://github.com/google/flatbuffers/releases 

FlatBuffers项目主页:

http://google.github.io/flatbuffers/index.html

项目在GitHub上的托管地址:

https://github.com/google/flatbuffers

 


经过几个月开发,FlatBuffers 1.1版本更新。这次的更新包含:


  • 对Java API进行了广泛的检修
  • out-of-the-box支持C#和Go
  • 一个可选的校对器,使FlatBuffers在不可信的情况下变得实用
  • 原型解析更容易从协议缓冲区迁移
  • 字段ID可选手动分配
  • 通过对一个键字段二进制查询的字典功能
  • bug修复和其他的改进


FlatBuffers与protobuf性能比较


http://blog.csdn.net/menggucaoyuan/article/details/34409433

......从以上数据看出,在内存空间占用这个指标上,FlatBuffers占用的内存空间比protobuf多了两倍。序列化时二者的cpu计算时间FB比PB快了3000ms左右,反序列化时二者的cpu计算时间FB比PB快了9000ms左右。FB在计算时间上占优势,而PB则在内存空间上占优(相比FB,这也正是它计算时间比较慢的原因)。

 

上面的测试环境是在公司的linux server端和我自己的mac pro分别进行的。请手机端开发者自己也在手机端进行下测试, 应该能得到类似的结果。Google宣称FB适合游戏开发是有道理的,如果在乎计算时间我想它也适用于后台开发。

 

另外,FB大量使用了C++11的语法,其从idl生成的代码接口不如protubuf友好。不过相比使用protobuf时的一堆头文件和占18M之多的lib库,FlatBuffers仅仅一个"flatbuffers/flatbuffers.h"就足够了。


一. 什么是Google FlatBuffers


FlatBuffers是一个开源的、跨平台的、高效的、提供了C++/Java接口的序列化工具库。它是Google专门为游戏开发或其他性能敏感的应用程序需求而创建。尤其更适用于移动平台,这些平台上内存大小及带宽相比桌面系统都是受限的,而应用程序比如游戏又有更高的性能要求。它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而不需要任何解析开销。

 

二. 为什么要使用Google FlatBuffers


对序列化数据的访问不需要打包和拆包——它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而没有任何解析开销;


  • 内存效率和速度——访问数据时的唯一内存需求就是缓冲区,不需要额外的内存分配。 这里可查看详细的 基准测试;
  • 扩展性、灵活性——它支持的可选字段意味着不仅能获得很好的前向/后向兼容性(对于长生命周期的游戏来说尤其重要,因为不需要每个新版本都更新所有数据);
  • 最小代码依赖——仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。再次,看基准部分细节;
  • 强类型设计——尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正;
  • 使用简单——生成的C++代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本;
  • 跨平台——支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好;

 

三. 为什么不使用Protocol Buffers的,或者JSON


Protocol Buffers的确和FlatBuffers比较类似,但其主要区别在于FlatBuffers在访问数据前不需要解析/拆包这一步。 而且Protocol Buffers既没有可选的文本导入/导出功能,也没有Schemas语法特性(比如union)。


JSON是非常可读的,而且当和动态类型语言(如JavaScript)一起使用时非常方便。然而在静态类型语言中序列化数据时,JSON不但具有运行效率低的明显缺点,而且会让你写更多的代码来访问数据(这个与直觉相反)。

 

四. 内建的数据类型


8 bit: byte ubyte bool

16 bit: short ushort

32 bit: int uint float

64 bit: long ulong double

Vector of any other type (denoted with [type]). Nesting vectors is not supported, instead you can wrap the inner vector in a table.

string, which may only hold UTF-8 or 7-bit ASCII. For other text encodings or general binary data use vectors ( [byte] or [ubyte]) instead.

References to other tables or structs, enums or unions.

 

五. 如何使用


  1. 编写一个用来定义你想序列化的数据的schema文件(又称IDL),数据类型可以是各种大小的int、float,或者是string、array,或者另一对象的引用,甚至是对象集合;
  2. 各个数据属性都是可选的,且可以设置默认值。
  3. 使用FlatBuffer编译器flatc生成C++头文件或者Java类,生成的代码里额外提供了访问、构造序列化数据的辅助类。生成的代码仅仅依赖flatbuffers.h;请看 如何生成;
  4. 使用FlatBufferBuilder类构造一个二进制buffer。你可以向这个buffer里循环添加各种对象,而且很简单,就是一个单一函数调用;
  5. 保存或者发送该buffer
  6. 当再次读取该buffer时,你可以得到这个buffer根对象的指针,然后就可以简单的就地读取数据内容;
目录
相关文章
|
2月前
|
缓存 Java Maven
Google guava工具类库的介绍和使用
Google guava工具类库的介绍和使用
|
3月前
|
C++
[序列化协议] --- protobuf
[序列化协议] --- protobuf
25 0
|
9月前
|
存储 编译器 文件存储
4.4 C++ Boost 数据集序列化库
Boost库提供了一组通用的数据序列化和反序列化库,包括archive、text_oarchive、text_iarchive、xml_oarchive、xml_iarchive等。可用于许多数据类型的持久化和传输。使用这些库,我们可以轻松地将各种数据类型序列化到文件或流中,并从文件或流中反序列化数据。
92 0
|
5月前
protobuf 序列化和反序列化
protobuf 序列化和反序列化
22 0
|
5月前
|
存储 XML JSON
日常小知识点之序列化结构(protobuf使用及简单原理)
日常小知识点之序列化结构(protobuf使用及简单原理)
63 0
|
5月前
|
XML JSON 网络协议
JSON和Protobuf序列化
因为像TCP和UDP这种底层协议只能发送字节流,因此当我们在开发一些远程过程调用(RPC)的程序时,需要将应用层的Java POJO对象序列化成字节流,数据接收端再反序列化成Java POJO对象。序列化一定会设计编码和格式化,目前常见的编码方式有:
|
5月前
|
JSON Java Go
Go内置序列化库 - gob
Go内置序列化库 - gob
|
6月前
|
编解码 Java C#
Google Protobuf 使用介绍
Google Protobuf 使用介绍
41 0
|
9月前
|
XML 存储 JSON
数据序列化工具 Protobuf 编码&避坑指南
我们现在所有的协议、配置、数据库的表达都是以 protobuf 来进行承载的,所以我想深入总结一下 protobuf 这个协议,以免踩坑。 先简单介绍一下 Protocol Buffers(protobuf),它是 Google 开发的一种数据序列化协议(与 XML、JSON 类似)。它具有很多优点,但也有一些需要注意的缺点: 优点: 效率高:Protobuf 以二进制格式存储数据,比如 XML 和 JSON 等文本格式更紧凑,也更快。序列化和反序列化的速度也很快。 跨语言支持:Protobuf 支持多种编程语言,包括 C++、Java、Python 等。 清晰的结构定义:使用 prot
|
12月前
|
JSON 数据格式 C++
Protobuf vs CBOR:新一代的二进制序列化格式
Protobuf vs CBOR:新一代的二进制序列化格式
567 0

热门文章

最新文章