1.头部
1.1.引用
使用include添加对其他thrift文件的引用,例如:
1 | `include "common.thrfit" ` |
注意,在使用的时候,要加文件名作为前缀,不是包名,例如:
1 | `// person.thrfit namespace java com.xyz.abc struct Person{ 1: string name; 2: i32 age } // service.thrift include "person.thrfit" namespace java abc.xzy.def service PersonRepository{ + person.Person get(1: int id) } ` |
1.2.命名空间
即为Java中包名(package)的概念,使用namespace关键字,例如:
1 | `namespace java com.xyz.abc namespace cpp Xyz.Abc namespace py xyz.abc ` |
通过编程语言名,可以为特定的编程语言生成特定的命名空间,也可以通过*所有目标语言使用命名空间。
2.数据类型
2.1.基础类型
- bool:布尔值(boolean)
- byte:8比特有符号整型(byte,Byte)
- i16:16比特有符号整型(short,Short)
- i32:32比特有符号整型(int,Integer)
- i64:64比特有符号整型(long,Long)
- double:64位浮点数(double,Double)
- string:UTF-8编码字符串(String)
2.2.容器类型
- list:ArrayList ,
- set:HashSet
- map:HashMap<FieldType, FieldType>
2.3.自定义类型 struct
Struct:类或者C语言中的结构,例如:
1 | `struct Work { 1: i32 num1 = 0, 2: i32 num2, 3: Operation op, 4: optional string comment, } ` |
structs的注意事项:
-
结构体不支持继承,一个结构体不能继承另一个结构体。
-
如果required标识的字段没有赋值,thrift将给予提示。
-
如果optional标识的字段没有赋值,该字段将不会被序列化传输。如果某个optional标识字段有缺省值而用户没有重新赋值,则该字段的值一直为缺省值。
2.4.异常
exception :
1 | `exception InvalidOperation { 1: i32 what, 2: string why } ` |
2.5.服务
services:服务由一组命名函数组成,每个函数都有一个参数列表和一个返回类型。它在语义上等同于定义接口或纯虚抽象类。对应于Java中的接口。
1 | `service StringCache { void set(1:i32 key, 2:string value), string get(1:i32 key) throws (1:KeyNotFound knf), oneway void delete(1:i32 key) } ` |
注意:
- ”oneway”标识符表示client发出请求后不必等待回复(非阻塞)直接进行下面的操作
- ”oneway”方法的返回值必须是void
- 参数可以是基本类型或者结构体,参数只能是只读的(const),不可以作为返回值
2.6.特殊类型
binary: 未编码的字节序列
2.7.其他标识符
2.7.1.枚举
enum:枚举创建一个枚举类型,具有命名值。如果未提供常量值,则第一个元素的值要么是 0,要么是任何后续元素的前一个值。提供的任何常量值都必须为非负值。
1 | `enum Operation { ADD = 1, SUBTRACT = 2, MULTIPLY = 3, DIVIDE = 4 } ` |
2.7.2.typedef:类型更名,别名
1 | `typedef i32 MyInteger ` |
2.7.3.const :常量
1 | `const i32 INT32CONSTANT = 9853 ` |
3.注释
Thrift支持shell注释风格、C/C++语言中的单行或多行注释风格
4.代码生成
4.1.语法
1 | `thrift [options] file ` |
例如,生成Java代码:
1 | `thrift -r --gen java fileName.thrift ` |
将会在当前目录下生成gen-java文件夹,该目录将包含 Thrift 在 java 中生成的所有代码。选项 -r 是指定我要为我们的 .thrift 文件中的潜在包含生成递归代码。
4.2.实例:
1 | `// thrift/person.thrift namespace java com.zxc.thriftTest struct Person{ 1: string name; 2: i32 age } // thrift/test.thrift include "person.thrift" namespace java com.zxc.thriftTest typedef i32 int; exception customException{ 1: string msg } service PersonRepository{ person.Person get(1: int id) throws (1:customException e); list listPersons(); void deletePerson(1:int id) } ` |
4.2.1.include文件递归生成——“-r参数”
thrift -r --gen java test.thrift生成的目录树:
1 | `xxxx\thrift │ person.thrift │ test.thrift │ └─gen-java └─com └─zxc └─thriftTest customException.java Person.java PersonRepository.java ` |
thrift --gen java test.thrift生成的目录树:
1 | `xxxx\thrift │ person.thrift │ test.thrift │ └─gen-java └─com └─zxc └─thriftTest customException.java PersonRepository.java ` |
不加参数**-r**,不生成include文件的代码。
4.2.2.指定输出目录——“-out dir”
-out dir参数将会更改默认的输出文件夹路径,将原来默认输出到gen-java文件夹中的内容输出到指定的dir中。
thrift -r --gen java -out ../java test.thrift:
1 | `xxxx\ ├─java │ │ Main.java │ │ │ └─com │ └─zxc │ └─thriftTest │ customException.java │ Person.java │ PersonRepository.java │ └─thrift person.thrift test.thrift ` |