<版本号,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个字节。
Thrift序列化
猜你喜欢
转载自lobin.iteye.com/blog/2397891
今日推荐
周排行