Thrift(二)——数据类型

Thrift 使用 IDL 定义数据类型,包括基本数据类型(如 bool、byte、i16、i32、i64、double 和 string),特殊类型(如 binary),结构体,容器(list、set 和 map),枚举,常量定义和类型定义,异常,服务,命名空间,注释和 include 机制。结构体和异常类似类,但不能继承。容器类型中的 map 的键类型最好是基本数据类型以保持兼容性。服务定义了接口,编译器生成 client 和 server stub。命名空间和 include 用于组织和重用代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thrift采用IDL(Interface Description Language/接口描述语言)来定义Thrift类型,然后由Thrift代码生成器生成开发人员所需要的目标语言代码文件。Thrift数据类型包含以下基本数据类型、结构体、容器、枚举等。

基本数据类型

基本数据类型简单明了,包含了所有编程语言中的可用基本数据类型。

  • bool:布尔值(true/false)
  • byte:8位有符号整型
  • i16:16位有符号整型
  • i32:32位有符号整型
  • i64:64位有符号整型
  • double:64位浮点数
  • string:由utf8编码的文本字符串
    注:没有无符号整型,因为有些编程语言不支持

    typedef bool boolType
    typedef i8 i8Type
    typedef i16 i16Type
    typedef byte byteType
    typedef i32 i32Type
    typedef i64 i64Type
    typedef string strType

特殊类型

  • binary:未编码的字节流
    字符串类型的特殊形式,设计目的是为了与Java更好的交互 (未来会提升为基本数据类型)
typedef binary binaryType

结构体(struct)

Thrift struct定义了一个公共的对象,基本等同于OOP语言中的类,但不能继承。struct有一组强类型字段,每个字段都有唯一的名称标识符。每个字段都可以具有IDL语言中描述的各种注释(数字字段ID,可选的默认值等)

struct StructType {
    1: required string msg; // 该字段必须填写
    2: optional i32 type = 0; // 赋予该字段默认值
    3: i32 time // 默认是optional
}

容器(container)

Thrift容器是强类型容器,可映射到大多数编程语言中常用的容器类型。
- list:元素的有序列表,对应转换到STL的vector,Java的ArrayList,脚本语言中的数组等
- set:无序的元素集合,对应转换到STL的set,Java的HashSet,Python的set等。注:php中不支持集合,所以于php而言它等同于list
- map:对应转到到STL的map,Java的HashMap,PHP的关联数组,Python/Ruby的字典等。虽然提供了默认值,但未明确修复类型映射。Thrift添加了自定义代码生成器指令,允许使用目标语言来替换自定义类型
容器元素可以是任何有效的thrift类型。
为了获得最大的兼容性,map的键类型最好是基本数据类型,而不是struct或者container。因为有些编程语言的原生map类型中不支持更复杂的键类型。此外,json协议只支持key的类型是基本数据类型

typedef list<string> listType
typedef set<string> setType
typedef map<string, string> mapType

枚举

枚举创建一个带有命名值的枚举类型,枚举类型第一个元素默认为0,也可以为其赋值,但后一个元素必须比前面的元素大。赋予的任何常量值必须为非负数。

enum enumType{
    code_ok= 0,
    code_err= 1
}

常量定义和类型定义

const i32 intConst = 1234
const enumType slefEnumType = enumType.code_ok

异常

除了它们在每种目标语言中适当的继承原生异常基类之外,异常在功能上类似于结构体。以便与任何目标语言中的本机异常处理无缝集成。

exception exceptionType{
    1: i32 errCode;
    2: string msg;
    3: string info
}

服务

使用Thrift类型来定义服务。服务的定义在语义上等同于OOP编程中定义的接口(或纯抽象类)。Thrift编译器会生成实现这些接口的client和server stub。
- 服务由一组命名函数组成,每组函数都有一个参数列表和一个返回类型。
- 除了其他所有已定义的已定义的Thrift类型之外,void是函数返回的有效类型
- 可以将单向修饰符关键字添加到void函数,该函数是生成不等待响应的代码
- 纯void函数将返回对客户端的响应,以确保操作已在服务端完成
- 使用单向方法调用客户端仅保证请求在传输层完成
- 可以由服务器并行/不按调用顺序的方式执行同一客户端的单向方法调用

service Hello{
    string helloString(1:string para);
    i32 helloInt(1:i32 para);
    bool helloBoolean(1:bool para);
    void helloVoid();
    string helloNull();
}

命名空间

Thrift的命名空间类似于C++中的namespace和java中的package,提供了一种隔离代码文件的方式,避免命名冲突等。

namespace java xxx
namespace cpp xxx
namespace php xxx

注释

Thrift支持Java中的多行注释

/**
* 这里是常量定义
**/

include

为了提高代码可用性,是代码可复用,经常将不同类别的代码写在不同的文件中,将代码隔离开。include使得来自另一个文件的所有符号都可见(带前缀使用),并将相应的include语句添加到此Thrift文档生成的代码中。

include "Hello.thrift"const i32 demoConst = Hello.intConst

Thrift系列博客:
Thrift(一)——基本使用与概念
Thrift(二)——数据类型
Thrift(三)——传输层、协议、处理器、服务端
Thrift(四)——几种服务端类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vi_NSN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值