Thrift类型

Thrift类型系统旨在允许程序员尽可能使用本机类型,无论使用何种编程语言。此信息基于并取代Thrift白皮书中的信息。Thrift IDL为每一种目标语言提供了用于生成代码的类型描述。

基本类型

基本类型是侧重于所有编程语言可用的关键类型:

bool:一个布尔值(true或false)

byte:一个8位有符号整数

i16:一个16位有符号整数

i32:一个32位有符号整数

i64:一个64位有符号整数

double:一个64位浮点数

string:使用UTF-8编码的文本字符串

特殊类型

binary:未编码的字节流。

注意:这是目前上述字符串类型的一种特殊形式,用于提供与Java更好的互操作性。目前的记录计划在某种程度上将其提升为基本类型。

结构体

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

struct Example {
1:i32 number = 0,
2:i64 bigNumber,
3:double decimals,
4:string name = "thrifty"
}

字段有optional和required之分,如果不指定则默认为required。其中required是必填字段,optional是可选字段,非必填的。而且每个字段可以设置默认值 。

struct Example {
1: required i32 number = 0,
2:optional i64 bigNumber,
3:double decimals,
4:string name = "thrifty"
}

容器

Thrift容器是强类型的容器,映射到大多数编程语言中常用的容器类型。

Thrift有三种容器:

list:一个有序的元素列表,转换成STL vector,Java ArrayList,脚本语言的native数组。

set:一个无序的元素集合,所有元素都是唯一的。转换成STL set,Java HashSet,Python的set等,PHP不支持set,所以它被视为类似于List。

map:一个严格唯一的键值映射。转换成STL map,Java HashMap,PHP关联数组,Python/Ruby字典等。虽然提供了默认值,但类型映射并未明确固定。已添加自定义代码生成器指令以允许用各种目标语言替换自定义类型。

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

注意:为了达到最大的兼容性,map的键类型应该是基本类型,而不是结构体或容器类型。有一些语言本机map类型不支持更复杂的键类型。另外,Json协议仅支持基本类型的键类型。

struct Example {
1:i32 number = 0,
2:i64 bigNumber,
3:double decimals,
4:string name = "thrifty",
5:map<string, string> idMap,
6:list<string> telphoneNumbers,
7:set<i32>
testSet
}

异常

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

exception TException {
1: i32 errCode,
2: string msg
}

枚举

1.编译器默认从0开始赋值 
2.可以赋予某个常量某个整数 
3.允许常量是十六进制整数 
4.末尾没有分号 
5.给常量赋缺省值时,使用常量的全称

enum TResult {
SUCCEED = 0,
FAILED = 1
}

常量定义

在变量前面加上const

const i32 SUCCEED = 0;

服务

服务使用Thrift类型进行定义。服务的定义在语义上等同于定义面向对象编程中的接口(或纯虚拟抽象类)。Thrift编译器生成实现该接口的功能齐全的客户端和服务器原型。

服务由一组命名函数组成,每个函数都有一个参数列表和一个返回类型。

请注意,除了所有其他定义的Thrift类型之外,void是函数返回的有效类型。此外,单向修饰符关键字可以添加到void函数中,该函数将生成不等待响应的代码。请注意,纯粹的void函数会向客户端返回一个响应,以确保操作在服务器端完成。使用单向方法调用客户端将只能保证请求在传输层成功。服务器可以并行/不按顺序执行同一客户端的单向方法调用。

service StringCache {
void setNode(1:i32 key, 2:string value),
string getNode(1:i32 key) throws(1:TException exp),
void delNode(1:i32 key)
}

Include

一个包含所有来自另一个文件的符号可见(带有前缀),并将相应的包含语句添加到为此Thrift文档生成的代码中。该特性可以清晰地管理代码模块。

include "example.thrift"
service StringTest {
void sayHello()throws(1:example.TException exp)
}

命名空间

Thrift中的命名空间类似于C++中的namespace和java中的package,它们提供了一种组织(隔离)代码的简便方式。命名空间也可以用于解决类型定义中的名字冲突。

namespace java thrift.test
namespace cpp thrift.test

注释

支持Java多行和单行注释风格。

/**
* Program doctext.
* Seriously, this is the documentation for this whole program.
*/ // this is a test

Thrift IDL的更多相关文章

  1. Thrift IDL使用方式

    I.背景 众所周知,Thrift是一个RPC的框架,其可用于不同语言之间的服务相互调用.比如最近接触到的一个运用环境: *前端使用Node.Js重构了部分我们的老旧代码(前后端未分离的SpringBo ...

  2. 环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools

    Apache Thrift - Centos 6.5 Install http://thrift.apache.org/docs/install/centos Building Apache Thri ...

  3. Thrift IDL基本语法

    简言:介绍Thrift的IDL基本语法,初次使用或多或少的会有很有"坑"要踩,但是我们要遇山挖山,遇海填海,在学习的道路上坚定的走下去,方可日后吹牛B! IDL Thrift 采用 ...

  4. thrift:swift项目笔记

    先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...

  5. Thrift:Quick Start

    Thrift 快速开始 1 Thrift 介绍 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其中所用到的 ...

  6. thrift 一个有意思的特性:Class名称无关性

    最近开发的一个项目,后端采用thrift框架来提供rpc服务(java语言实现),然后前端采用php语言来生成thrift client调用后台RPC服务.由于某些原因,上周我把thrift定义文件中 ...

  7. Apache Avro 与 Thrift 比较

    http://www.tbdata.org/archives/1307 Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间件. 它们都提供了数据序列化的功能和RPC服务. 总体功能上类似, ...

  8. [转] thrift的使用介绍

    http://gemantic.iteye.com/blog/1199214 一.About  thrift   二.什么是thrift,怎么工作? 三.Thrift  IDL 四.Thrift   ...

  9. Apache Thrift的简单使用

    Apache Thrift的简单使用 ---------------------- 1. 简介 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架.它有一个代码生成器来对它所 ...

随机推荐

  1. 使用Git添加Tag的方法

    简述作为版本管理工具,Git可以对某个版本打上标签(tag),表示本版本为发行版.在发布软件,以及使用CocoaPods创建依赖库等情况时,需要对其版本使用标签注释.故简单总结一下添加tag的方式. ...

  2. 使用 cmake 进行交叉编译

    cmake 因为“又”要额外学一门语言而被诟病,但这并不妨碍越来越多私人项目用 cmake 来管理:autoconfig 确实是更好的发行工具,但用 cmake 管理项目显然更加的容易.如果要应用这些 ...

  3. redis 频率限制

    方式1: $redis = new Redis(); //以自然时间控制 一自然分钟内超过100次进行限制, 屏蔽多久的时间必须为计数key时间的倍数 $key = 'xxxx'.date('Y-m- ...

  4. file命令与magic file【转】

    Linux基础——file命令与magic file [日期:2013-06-03] 来源:Linux社区  作者:sin90lzc [字体:大 中 小]   //本文基于CentOS6.3 dist ...

  5. IT? 挨踢

    中国的IT,是最憋屈的IT. 他们掌握着正常人看不懂的英文+字母+标点符号组成的各类代码语言 他们像作者一样从无到有,从空白的白纸上敲出上千上万条华丽的计算机语言 但是他们承受着正常人的鄙视: 我的需 ...

  6. ipa重签名

    为什么要研究重签名问题?将程序打包成ipa包后,ipa包中会包含Provisioning Profile和_CodeSignature等文件,里面包含了对整个ipa的签名信息. 一旦改动ipa中的不论 ...

  7. tar加密

    # tar -czvf - file_name|openssl des3 -salt -k |dd of=file_name.des3 # ls flie_name file_name.des3 # ...

  8. python 列表排序方法sort、sorted技巧篇

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...

  9. 【emWin】例程十二:FontCvt生成字库

    介绍: 本例程介绍使用官方字库生成软件FontCvt5.22生成字库文件,并在液晶上显示文字. 实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1eSkliDW 密码:o ...

  10. 【emWin】例程二十六:窗口对象——Listbox

    简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...