命名空间Thrift中的命名空间同C++中的namespace和java中的package类似,它们均提供了一种组织(隔离)代码的方式。因为每种语言均有自己的命名空间定义方式(如python中有module),thrift允许开发者针对特定语言定义namespace:
namespace cpp com.example.project // anamespace java com.example.project // b说明:
- 转化成namespace com { namespace example { namespace project {
- 转换成package com.example.project
文件包含Thrift允许thrift文件包含,用户需要使用thrift文件名作为前缀访问被包含的对象,如:
include "tweet.thrift" // a...struct TweetSearchResult { list<tweet.Tweet> tweets; // b}说明:
- thrift文件名要用双引号包含,末尾没有逗号或者分号
- 注意tweet前缀
常量Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。
const i32 INT_CONST = 1234; // aconst map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}说明:分号是可选的,可有可无;支持十六进制赋值。
定义结构体结构体由一系列域组成,每个域有唯一整数标识符,类型,名字和可选的缺省参数组成。如:
struct Tweet { required i32 userId; // a required string userName; // b required string text; optional Location loc; // c optional string language = "english" // d}struct Location { // e required double latitude; required double longitude;}说明:
- 每个域有一个唯一的,正整数标识符
- 每个域可以标识为required或者optional(也可以不注明)
- 结构体可以包含其他结构体
- 域可以有缺省值
- 一个thrift中可定义多个结构体,并存在引用关系
规范的struct定义中的每个域均会使用required或者optional关键字进行标识。如果required标识的域没有赋值,thrift将给予提示。如果optional标识的域没有赋值,该域将不会被序列化传输。如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值。
与service不同,结构体不支持继承,即,一个结构体不能继承另一个结构体。 |