Flat Buffers - 简介

在介绍Flat Buffers之前,让我们先简单了解一下序列化的背景,这就是Flat Buffers的作用。

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

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

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

序列化有助于保存对象状态,然后我们可以通过网络将其传输到任何地方。一旦收到,我们就可以反序列化对象,换句话说,我们可以随时从不同机器上的字节恢复我们的对象。这是序列化和反序列化的许多重要用例之一。另一个重要用例是通过网络传输对象。消息队列、数据库对象、REST API 都遵循此原则。在这种情况下,对象首先由发送方序列化,然后传输给接收方。然后,接收方反序列化序列化的对象。

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

为什么是Flat Buffers?

Google Flat Buffers 将对象序列化和反序列化为可以通过网络传输的字节。但是,还有一些其他库和机制可以传输数据。

那么,Flat Buffers 有什么特别之处?以下是它的一些重要功能 −

  • 语言独立 − Flat Buffers 编译器可以为许多语言创建代码,如 Java、Python、Go、C、C++ 等。因此,Java 对象可以从 Java 程序序列化为字节,并可以反序列化为 Python 对象,反之亦然。

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

  • 向后和向前兼容性 − Flat Buffers 架构既向后兼容,又向前兼容。Flat Buffers 的架构支持在较新的代码中添加更改,并允许弃用较旧的更改而不会破坏向后兼容性。

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

  • 可转换 JSON Flat Buffers 架构文件可以转换为 JSON 文件,同样,我们可以使用 Flat Buffers 架构转换 JSON 文件。

Flat Buffers 与其他(XML/JSON/Java 序列化)

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

功能 Flat Buffers JSON XML
与语言无关 Yes Yes Yes
序列化数据大小 三者中最小 小于 XML 三者中最高
人类可读性 No,因为它使用单独的编码模式 Yes,因为它使用基于文本的格式 Yes,因为它使用基于文本的格式格式
序列化速度 三者中最快的 比 XML 快 三者中慢的
数据类型支持 比其他两个更丰富。支持复杂的数据类型,如 Any、one of 等。 支持基本数据类型 支持基本数据类型
支持不断发展的模式 Yes No No