Thrift序列化

31 篇文章 0 订阅
10 篇文章 0 订阅
<版本号,2字节><无用字段,1字节><消息类型,1字节><方法名长度,4字节><方法名,n字节><序列号,4字节><参数…,n字节>

<参数…,n字节>参考struct

Field
<Field类型,1字节><Field Id,2字节>
<Field类型(stop),1字节>


上面的Field Id对应下面例子中”:”前面的数字:

struct Order {
1: required i64 orderId;
2: required i64 userId;
3: required string status;
}


Field
stop
<Field类型(stop),1字节> -> <0x00(0),1字节>

void
bool
<Field类型(bool),1字节><Field Id,2字节><值,bool(1字节)> -> <0x02(2),1字节><Field Id,2字节><值,bool(1字节)>

byte
<Field类型(byte),1字节><Field Id,2字节><值,byte(1字节)> -> <0x03(3),1字节><Field Id,2字节><值,byte(1字节)>

double
<Field类型(double),1字节><Field Id,2字节><值,double(8字节)> -> <0x04 (4),1字节><Field Id,2字节><值,double(8字节)>


i16
<Field类型(i16),1字节><Field Id,2字节><值,i16(2字节)> -> <0x06(6),1字节><Field Id,2字节><值,i16(2字节)>

i32
<Field类型(i32),1字节><Field Id,2字节><值,i32(4字节)> -> <0x08(8),1字节><Field Id,2字节><值,i32(4字节)>

i64
<Field类型(i64),1字节><Field Id,2字节><值,i64(8字节)> -> <0x0A(10),1字节><Field Id,2字节><值,i64(8字节)>


string

<Field类型(string),1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> -> <0x0B(11),1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节>


struct
<Field类型(struct),1字节><Field Id,2字节>…<Field类型(stop),1字节> -> <0x0C(12),1字节><Field Id,2字节>… <0x00(0),1字节>


<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |
(<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

<Field类型(stop),1字节>)

<Field类型(stop),1字节>


几种特殊情况下的struct
方法参数(args)
方法调用时需要传递的参数通过struct进行序列化。在scheme中实现。


<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |
(<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

<Field类型(stop),1字节>)|

<Field类型(stop),1字节>


方法返回
方法调用后返回值通过struct进行序列化。在scheme中实现。


map
<Field类型(map),1字节><Field Id,2字节>< map中key类型,1字节>< map中value类型,1字节>< set中元素个数,4字节>
((<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |
(<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

<Field类型(stop),1字节>))
(<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |
(<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

<Field类型(stop),1字节>)))



set
<Field类型(set),1字节><Field Id,2字节>< set中元素类型,1字节>< set中元素个数,4字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |
(<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

<Field类型(stop),1字节>)



list
<Field类型(list),1字节><Field Id,2字节><list中元素类型,1字节><list中元素个数,4字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |
(<Field类型(struct),1字节><Field Id,2字节>
<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|
<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|
<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|
<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|
<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|
<Field类型,1字节><Field Id,2字节><值,double(8字节)>|
<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

<Field类型(stop),1字节>)



enum


版本号
版本字段由第1-2个字节决定,必须是0x80, 0x01。总共2个字节,转换为整型为0x8001???? ,与掩码0xffff0000进行与操作后得到版本号。
0x8001???? -> 0x80 0x01 0x?? 0x??

0x80010000 -> 0x80 0x01 0x00 0x00

消息类型
消息类型字段由第4个字段决定,包括call(1)、reply(2)、exception(3)以及one-way(4) 4种消息类型

方法名长度
方法名长度字段由第5-8个字段决定。

方法名
方法名字段由第9-?个字段决定。

序列号
4个字节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值