1 数据类型
基本类型(Base Types)、特殊类型(Special Types)、结构体(Structs)、容器(Containers)、异常(Exceptions)、服务(Services) 枚举类型、常量类型。
1.1 基本类型
(括号内为对应的Java类型)
bool(boolean):布尔值 (true or false)
byte(byte):8位有符号整数
i16(short):16位有符号整型
i32(int):32位有符号整型
i64(long):64位有符号整型
double(double):64位浮点型
string(String):采用UTF-8编码的字符串
1.2 特殊类型
(括号内为对应的Java类型)
binary(ByteBuffer):未经过编码的字节流
1.3 结构体
在 java 中 Thrift 结构体将会被转换成OOP对象。
struct ExampleStruct {
1: required i32 feild1;
2: optional string feild2= "defualt";
3: set<string> feild3
}
- struct 不能继承,可以嵌套,不能自我嵌套
- 可以设置默认值
- 字段要编号
- 分割符可以是逗号(,)或是分号(;),可以混用
- 同一文件可以定义多个struct,也可以定义在不同的文件,include引入
- 可选与必选: 字段会有optional和required之分,如果不指定则为无类型。
无类型:可以不填,会序列化 optional: 不填充则不序列化 required:必须填充必须序列化
1.4 容器
有3种可用容器类型(括号内为对应的Java类型):
list<t>(ArrayList):元素类型为t的有序表,容许元素重复。
set<t>(HashSet):元素类型为t的无序表,不容许元素重复。
map<k,v>(HashMap):key/value对,键不容许重复。
容器中元素类型可以是除了 service 外的任何合法 Thrift 类型。
1.5 异常
异常在语法和功能上相当于结构体,差别是异常使用关键字 exception 而不是 struct 声明。它在语义上不同于结构体:当定义一个 RPC 服务时,开发者可能需要声明一个远程方法抛出一个异常。
exception RequestException {
1: i32 code;
2: string reason;
}
1.6 服务
服务的定义方法在语法上等同于面向对象语言中定义接口。Thrift编译器会产生实现这些接口的client和server桩。具体参见下一节。
service exampleService {
ExampleStruct queryExampleStruct(1:i32 feild1, 2:string feild2);
set<string> queryFeild3(1:i32 feild1);
}
在上面的例子中我们定义了一个 service 类型的结构,里面包含两个方法的定义。
在定义 services 的时候,我们还需要了解一下规则:
- 继承类必须实现这些方法
- 参数可以是基本类型或者结构体
- 所有的参数都是const类型,不能作为返回值
- 返回值可以是void(oneway的返回值一定是void)
- 服务支持继承,一个service可使用extends关键字继承另一个service
- 服务不支持重载
1.7 其他
Thrift 还支持枚举(enum)和常量(const)。 ####枚举(enum) 可以像C/C++那样定义枚举类型。
thrift不支持枚举类嵌套,枚举常量必须是32位的正整数。
enum ExampleEnum {
Example1, //编译器默认从0开始赋值
Example2 = 2, //可以赋予某个常量某个整数
Example3 = 0xa, //允许常量是十六进制整数
Example4
}
ExampleEnum exampleEnum = ExampleEnum.Example1// 给常量赋缺省值时,使用常量的全称
常量(const)
Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。
const i32 INT_CONST = 1234; // 分号是可选的,可有可无;支持十六进制赋值。
const map<string,string> MAP_CONST = {"hello": "world", "goodbye": "bye"}
2 基本语法
2.1 命名空间(namespace)
Thrift 中的命名空间类似于 java 中的 package,它们提供了一种组织(隔离)代码的简便方式。名字空间也可以用于解决类型定义中的名字冲突。
namespace java com.example.project // 转换成package com.example.project
2.2 文件包含(include)
Thrift允许thrift文件包含,用户需要使用thrift文件名作为前缀访问被包含的对象
include "exampleThrift.thrift"
2.3 类型定义(typedef)
Thrift支持C/C++风格的typedef
typedef exampleThrift.Example Example
typedef i32 MyInteger
2.4 注释
thrift注释方式支持shell风格的注释,支持C/C++风格的注释,即#和//开头的语句都单当做注释,/**/包裹的语句也是注释。
# This is a valid comment.
/*
* This is a multi-line comment.
*/
// C++/Java style single-line comments work just as well.