Thrift序列化协议

下面所有序列化或者反序列化均以下方IDL文件为例。struct Header { 1: string sendHostName, 3: string senderHostIP, 12: i32 sendCount, 13: map<string,string> nameMapping, 14: list<i32> nums;}string、数组类型数据格式:string反序列化:public String readString()
摘要由CSDN通过智能技术生成

IDL文件示例
struct Header {
   
    1: string sendHostName,
    3: string senderHostIP,
    12: i32 sendCount,
    13: map<string,string> nameMapping,
    14: list<i32> nums;
}

Thrift message概览

在这里插入图片描述

Thrift通信单元

thrift通信的单元是一个message,格式如下:
在这里插入图片描述
各字段解释:
1)版本号:用15个bit表示,因为前导1的存在,这16位总是一个负数。
每次预先读取msg的前32位,使用VERSION_MASK 0xffff0000来获取前16位。
目前默认的版本号是0x80010000。
2)待使用:待使用的一个字节。
3)消息类型:用后3个bit表示消息类型,分别是:

消息类型 16进制值 处理方式
CALL 0x80010001 调用方法,并期望获得返回
REPLY 0x80010002 来自服务端的返回消息
EXCEPTION 0x0x80010003 服务端处理请求时出现异常
ONEWAY 0x80010004 单向请求,不需要返回

4)方法名的长度:用4个字节来表示。
5)方法名:调用的方法的名称,长度由方法名长度来表示,UTF-8的编码。
6)序列号:负责排序。

通信单元的数据载荷–Struct

Thrift的message中的有效数据载荷部分由一个或者多个struct组成(除了请求方法名),一个struct由多个Field组成,Field的编码格式如下:

在这里插入图片描述

其中,field type是任何一个基本类型,fieldId是定义IDL文件时写在属性最左方的数字(比如sendHostName属性的fieldId是1),fieldValue则是基本类型序列化之后的结果。

Thrift基本类型列表:

基本类型名 idl类型名 对应的Java类型 占用字节数 类型ID
bool bool bool 1 2
byte byte byte 1 3
short i16 short 2 6
int i32 int 4 8
long i64 long 8 10
double double double 8 4
string string java.lang.String 4+N 11
[]byte binary java.nio.ByteBuffer 4+N 11
list list java.util.List(java.util.ArrayList) 1+4+N 15
set set (java.util.Set)java.util.HashSet 1+4+N 14
map map java.util.Map(java.util.HashMap) 1+1+4+NX+NY 13
field 1+2+X
struct struct N*X 12
enum
union
exception

这里要注意的是binary类型的数据,它的类型ID是string的类型ID。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Thrift是一个跨语言的服务框架,用于定义和生成多种编程语言的通信代码。下面是Thrift初始化的一般流程: 1. 定义接口:首先需要编写一个Thrift接口定义文件(.thrift文件),其中包含服务的接口和数据类型定义。接口定义了可用的方法以及它们的参数和返回类型。 2. 生成代码:使用Thrift编译器,将接口定义文件生成所需编程语言的代码。Thrift支持多种编程语言,如Java、C++、Python等。生成的代码包括接口的实现类和客户端类。 3. 实现服务端:在所选编程语言中,实现Thrift生成的接口实现类。该类包含了具体的方法实现逻辑,以及监听网络连接的代码。 4. 启动服务端:在服务端代码中,启动Thrift服务,开始监听指定的网络端口。一旦有客户端连接到该端口,服务端将处理客户端请求。 5. 编写客户端:在所选编程语言中,使用Thrift生成的客户端类,连接到运行中的Thrift服务。客户端可以通过调用生成的方法来与服务端进行通信。 6. 进行通信:客户端通过调用生成的方法,将请求发送给Thrift服务端。Thrift使用自定义的二进制协议进行序列化和反序列化,在客户端和服务端之间进行数据传输。 总的来说,Thrift的初始化流程包括定义接口、生成代码、实现服务端、启动服务端、编写客户端以及进行通信。通过Thrift,不同编程语言的应用程序可以方便地进行跨语言的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值