FlatBuffers - 简介



在我们深入了解 FlatBuffers 之前,让我们先简要了解一下序列化,这是 FlatBuffers 所做的工作。

什么是序列化和反序列化?

每当我们需要将对象状态持久化到内存系统时,都需要序列化。在序列化中,我们将对象转换为字节,并将这些字节存储在内存系统中。这些存储的字节随后可以反序列化以恢复对象状态。由于我们将对象转换为字节,因此它可以存储在任何地方,包括文件系统、消息队列、数据库等等,然后我们可以将这些字节传输到不同的机器并检索对象状态。

为什么我们需要序列化和反序列化?

序列化有助于持久化对象状态,然后我们可以将其传输到网络上的任何位置。接收后,我们可以反序列化对象,或者换句话说,我们可以随时在不同的机器上从字节中恢复我们的对象。这是序列化和反序列化许多重要用例之一。另一个重要的用例是需要通过网络传输对象的情况。消息队列、数据库对象、REST API 都基于此原理。在这种情况下,发送方首先对对象进行序列化,然后将其传输到接收方。接收方然后反序列化已序列化的对象。

在 REST API、微服务架构中,应用程序通常被分解成小的服务,这些服务通过消息队列和 API 相互通信。由于通信是在网络上进行的,需要频繁地将对象转换为字节,然后再转换回对象。因此,序列化和反序列化在分布式环境中变得非常关键。

为什么选择 FlatBuffers?

Google FlatBuffers 执行将对象序列化和反序列化为字节的操作,这些字节可以传输到网络上。但是也有一些其他的库和机制也可以传输数据。

那么,是什么让 FlatBuffers 特别呢?以下是一些重要的特性:

  • 语言无关性 - FlatBuffers 编译器可以为许多语言创建代码,例如 Java、Python、Go、C、C++ 等。因此,Java 对象可以由 Java 程序序列化为字节,并可以反序列化为 Python 对象,反之亦然。

  • 高效的数据压缩 - FlatBuffers API 最初是为游戏环境和性能关键型系统开发的,其设计考虑了数据压缩和性能。它非常节省内存,甚至比 Google Protocol Buffers(另一个 Google 序列化和反序列化库)更快。

  • 向后和向前兼容性 - FlatBuffers 架构同时具有向后和向前兼容性。FlatBuffers 的模式支持在较新代码中添加更改,并允许弃用较旧的更改而不会破坏向后兼容性。

  • 易于使用 - FlatBuffers 库自动生成序列化代码(我们将在接下来的章节中看到),具有版本控制方案,以确保数据创建者和数据使用者可以具有序列化定义的不同版本等。

  • JSON 可转换 FlatBuffers 模式文件可以转换为 JSON 文件,同样,我们可以使用 FlatBuffers 模式转换 JSON 文件。

FlatBuffers 与其他方法的比较 (XML/JSON/Java 序列化)

让我们看看其他通过网络传输数据的方法与 FlatBuffers 相比如何。

特性 FlatBuffers JSON XML
语言无关性
序列化数据大小 三者中最少 小于 XML 三者中最大
人类可读性 否,因为它使用单独的编码模式 是,因为它使用基于文本的格式 是,因为它使用基于文本的格式
序列化速度 三者中最快 比 XML 快 三者中最慢
数据类型支持 比其他两者更丰富。支持复杂的数据类型,例如 Any、oneof 等。 支持基本数据类型 支持基本数据类型
对演变模式的支持
广告