Apache Thrift - 序列化

Apache Thrift 中的序列化

序列化和反序列化过程是 Apache Thrift 框架中迄今为止最重要的操作。由于数据结构需要通过客户端和服务器发送,因此这些操作是这些事务过程中的基础。

本教程旨在详细解释这些过程是如何进行的,以及 Thrift 如何将可用数据编码并转换为可传输数据(序列化),并最终将可传输数据转换为可用数据(反序列化)。

Thrift 中的数据类型

在深入研究序列化之前,了解 Thrift 支持的基本数据类型非常重要,因为这些是序列化数据的构建块。

基本数据类型

以下是 Thrift 支持的基本数据类型

  • bool:表示布尔值(真或假)。
  • byte:表示 8 位有符号整数。
  • i16:表示 16 位有符号整数。
  • i32:表示 32 位有符号整数。
  • i64:表示 64 位有符号整数。
  • double:表示双精度浮点数。
  • string:表示 UTF-8 编码的字符串。

复杂数据类型

以下是 Thrift 支持的复杂数据类型

  • list<T>: 类型为 T 的元素的有序集合。
  • set<T>: 类型为 T 的唯一元素的无序集合。
  • map<K, V>: 键值对的集合,其中 K 是键类型,V 是值类型。
  • struct: 将相关字段分组的用户定义复合类型。
  • enum: 一组命名的整数常量。

序列化过程

Thrift 中的序列化涉及将 Thrift IDL(接口定义语言)中定义的数据类型转换为二进制或文本格式,以便于通过网络传输或存储以供日后使用。

Thrift 提供了几种序列化协议,包括TBinaryProtocolTCompactProtocolTJSONProtocol,每个都有自己的优势和用例。

以下是执行序列化过程的基本步骤 −

步骤 1:选择协议

序列化过程的第一步是根据应用程序的要求决定使用哪种序列化协议 −

  • TBinaryProtocol:适用于性能和效率至关重要的应用程序。
  • TCompactProtocol:最适合需要紧凑数据表示的场景。
  • TJSONProtocol:非常适合需要人类可读数据和易于与 Web 技术集成的应用程序。

步骤 2:创建协议工厂

接下来,您需要创建一个协议工厂。协议工厂负责生成处理数据序列化和反序列化的协议对象 −

from thrift.protocol import TBinaryProtocol

protocol_factory = TBinaryProtocol.TBinaryProtocolFactory()

步骤 3:序列化数据

使用生成的 Thrift 代码(基于您的 IDL 文件),您现在可以将数据结构序列化为所选的协议格式。这涉及为序列化过程创建内存传输,然后使用协议写入数据 −

from thrift.transport import TTransport
from example.ttypes import Person

# 创建用于序列化的内存传输
transport = TTransport.TMemoryBuffer()
protocol = protocol_factory.getProtocol(transport)

# Thrift IDL 中的示例结构
person = Person(name="Alice", age=30)

# 序列化数据
person.write(protocol)
serialized_data = transport.getvalue()

步骤 4:传输或存储序列化数据

一旦数据被序列化,就可以通过网络传输或存储以供日后使用。序列化的数据格式可以在接收端轻松反序列化回原始数据结构。

协议及其用例

Apache Thrift 提供了多种序列化和反序列化协议,每种协议都旨在满足性能、数据大小和可读性方面的不同需求。

了解每种协议的具体用例有助于为您的应用程序选择合适的协议。

  • TBinaryProtocol:高效、快速的二进制序列化。最适合性能关键型应用程序。
  • TCompactProtocol:更紧凑的二进制序列化。在减小数据大小很重要时很有用。
  • TJSONProtocol:基于 JSON 的序列化。非常适合可读性和与 Web 技术集成。