Thrift序列化

<版本号,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个字节。



猜你喜欢

转载自lobin.iteye.com/blog/2397891
今日推荐