Thrift 类型系统

师成师成· 更新于 2026-09-28· 阅读 4 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Thrift 类型

Thrift 类型系统旨在让程序员尽可能地使用原生类型,无论他们使用哪种编程语言。本信息基于 Thrift 白皮书中的内容并取代之。Thrift IDL 提供了各类型的描述,用于为每种目标语言生成代码。

基础类型

基础类型的选择以简洁明了为目标,而非追求数量,重点在于各编程语言中普遍可用的关键类型。

  • bool:布尔值(true 或 false)
  • byte:8 位有符号整数
  • i16:16 位有符号整数
  • i32:32 位有符号整数
  • i64:64 位有符号整数
  • double:64 位浮点数
  • string:使用 UTF-8 编码的文本字符串

注意这里没有无符号整数类型。这是因为许多编程语言中不存在原生的无符号整数类型。

特殊类型

binary:未编码的字节序列

注意:这目前是上述 string 类型的一种特殊形式,加入它是为了更好地与 Java 互操作。目前的既定计划是在未来某个时候将其提升为基础类型。

结构体(Struct)

Thrift 结构体定义了一个通用对象——它们本质上等同于面向对象语言中的类,但没有继承。结构体包含一组强类型字段,每个字段都有唯一的名称标识符。字段可以带有各种注解(数字字段 ID、可选的默认值等),详见 Thrift IDL。

容器

Thrift 容器是强类型容器,对应于大多数编程语言中常用且普遍可用的容器类型。

容器类型有三种:

  • list:元素的有序列表。对应于 STL vector、Java ArrayList、脚本语言中的原生数组等。
  • set:唯一元素的无序集合。对应于 STL set、Java HashSet、Python 中的 set 等。注意:PHP 不支持集合,因此将其视为类似 List 的类型。
  • map<type1,type2>:键严格唯一的映射。对应于 STL map、Java HashMap、PHP 关联数组、Python/Ruby 字典等。虽然提供了默认映射,但类型映射并未显式固定。已加入自定义代码生成指令,以便在各种目标语言中替换为自定义类型。

容器元素可以是任何有效的 Thrift 类型。

注意:为了获得最大程度的兼容性,map 的键类型应为基础类型,而不是结构体或容器类型。某些语言在其原生 map 类型中不支持更复杂的键类型。此外,JSON 协议仅支持基础类型的键。

异常

异常在功能上等同于结构体,区别在于它们会根据各目标编程语言的规范继承相应的原生异常基类,从而能够与任意语言的原生异常处理机制无缝集成。

服务

服务使用 Thrift 类型来定义。定义一个服务在语义上等同于在面向对象编程中定义一个接口(或纯虚抽象类)。Thrift 编译器会生成功能完整的客户端与服务端桩代码,用以实现该接口。

服务由一组具名函数构成,每个函数都拥有一系列参数和一个返回类型。

请注意,除所有已定义的 Thrift 类型外,void 也是函数返回值的有效类型。此外,还可以为 void 函数添加 oneway 修饰关键字,这样生成的代码将不会等待响应。请注意,纯 void 函数仍会向客户端返回一个响应,以保证该操作已在服务端完成。而对于 oneway 方法调用,客户端只能保证请求在传输层上已成功发出。同一客户端的 oneway 方法调用可能会被服务端并行执行,或以乱序执行。

评论

登录后参与评论

正在加载评论…