- FlatBuffers 教程
- FlatBuffers - 首页
- FlatBuffers - 简介
- FlatBuffers - 模式 (Schema)
- FlatBuffers - 结构
- FlatBuffers - 表格
- FlatBuffers - 字符串
- FlatBuffers - 数字
- FlatBuffers - 布尔值
- FlatBuffers - 枚举
- FlatBuffers - 向量
- FlatBuffers - 结构体
- FlatBuffers - 联合体
- FlatBuffers - 嵌套表格
- FlatBuffers - 默认值
- FlatBuffers - JSON 转二进制
- FlatBuffers - 二进制转 JSON
- FlatBuffers - 可变缓冲区
- FlatBuffers - 向后兼容性
- FlatBuffers - 语言无关性
- FlatBuffers 有用资源
- FlatBuffers - 快速指南
- FlatBuffers - 有用资源
- FlatBuffers - 讨论
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 等。 | 支持基本数据类型 | 支持基本数据类型 |
对演变模式的支持 | 是 | 否 | 否 |