Thrift serialization

<version number, 2 bytes> <useless field, 1 byte> <message type, 1 byte> <method name length, 4 bytes> <method name, n bytes> <serial number, 4 bytes>< Parameters..., n bytes>

<parameters..., n bytes> refer to struct

Field
<Field type, 1 byte> <Field Id, 2 bytes>
<Field type (stop), 1 byte>




The above Field Id corresponds to The number before ":" in the following example:

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




Field
stop
<Field type (stop), 1 byte> -> <0x00( 0), 1 byte>

void
bool
<Field type (bool), 1 byte> <Field Id, 2 bytes> <value, bool (1 byte)> -> <0x02(2), 1 byte> <Field Id, 2 bytes><value, bool(1 byte)>

byte
<Field type(byte), 1 byte><Field Id, 2 bytes><value, byte(1 byte)> -> < 0x03(3), 1 byte><Field Id, 2 bytes><value, byte(1 byte)>

double
<Field type (double), 1 byte> <Field Id, 2 bytes> <value, double (8 bytes)> -> <0x04 (4), 1 byte><Field Id, 2 bytes>< value, double(8 bytes)>









i16
<Field type(i16), 1 byte> <Field Id, 2 bytes> <value, i16(2 bytes)> -> <0x06(6), 1 byte ><Field Id, 2 bytes> <value, i16 (2 bytes)>

i32
<Field type (i32), 1 byte> <Field Id, 2 bytes> <value, i32 (4 bytes)> - > <0x08(8), 1 byte><Field Id, 2 bytes><value, i32(4 bytes)>

i64
<Field type(i64), 1 byte><Field Id, 2 bytes>< value, i64(8 bytes)> -> <0x0A(10), 1 byte> <Field Id, 2 bytes> <value, i64(8 bytes)>









string

<Field type(string), 1 byte ><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> -> <0x0B(11), 1 byte><Field Id, 2 bytes><string type field length, 4 bytes> <value, n bytes>









struct
< Field type (struct), 1 byte><Field Id, 2 bytes>...<Field type (stop), 1 byte> -> <0x0C(12), 1 byte><Field Id, 2 bytes> … <0x00(0), 1 byte>


<Field type (struct), 1 byte> <Field Id, 2 bytes>
    <Field type, 1 byte><Field Id, 2 bytes><value, bool(1 byte)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 word section)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i16(2 bytes)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i32(4 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, i64(8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes ><value, double (8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> |
    (<Field type (struct), 1 byte> <Field Id, 2 bytes>
        <Field type, 1 byte> <Field Id, 2 bytes> <value, bool(1 byte)> |
        <Field type, 1 byte ><Field Id,2bytes><value,byte(1byte)>|
        <Field type,1byte><Field Id,2bytes><value,i16(2bytes)> |
        <Field type, 1 byte> <Field Id, 2 bytes> <value, i32(4 bytes)>|
        <Field type, 1 byte> <Field Id, 2 bytes> <value, i64(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value,nbytes>|
        …
    <Field type(stop),1byte>)
    …
<Fieldtype(stop),1byte> struct method parameters (args) method calls



in several special cases The parameters that need to be passed are serialized through struct. Implemented in the scheme. <Field type, 1 byte><Field Id, 2 bytes><value, bool(1 byte)>| <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 word section)>| <Field type, 1 byte> <Field Id, 2 bytes> <value, i16(2 bytes)>| <Field type, 1 byte> <Field Id, 2 bytes> <value, i32(4 bytes)>| <Field type, 1 byte><Field Id, 2 bytes><value, i64(8 bytes)>| <Field type, 1 byte><Field Id, 2 bytes ><value, double (8 bytes)>| <Field type,













    <Field type, 1 byte><Field Id, 2 bytes><value, bool(1 byte)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 word section)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i16(2 bytes)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i32(4 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, i64(8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes ><value, double (8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> |
    …
<Field type (stop), 1 byte>)|

<Field type (stop), 1 byte>






Method return After the
method is called, the return value is serialized through struct. Implemented in the scheme.




map
<Field type (map), 1 byte><Field Id, 2 bytes><key type in map, 1 byte><value type in map, 1 byte><number of elements in set,


    <Field type, 1 byte> <Field Id, 2 bytes> <value, i16 (2 bytes)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i32 (4 bytes) section)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, i64(8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> |
    (<Field type(struct), 1byte><Field Id,2bytes>
        <Field type,1byte><Field Id,2bytes><value,bool(1byte)>|
        <Fieldtype,1byte><Field Id ,2bytes><value,byte(1byte)>|
        <Field type,1byte><Field Id,2bytes><value,i16(2bytes)>|
        <Fieldtype,1byte ><Field Id, 2 bytes> <value, i32 (4 bytes)>|
        <Field type, 1 byte> <Field Id, 2 bytes> <value, i64 (8 bytes)> |
        <Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value,nbytes>|
        …
    <Field type (stop), 1 byte>))
    (<Field type, 1 byte> <Field Id, 2 bytes> <value, bool (1 byte)> |
    <Field type, 1 byte>< Field Id, 2 bytes><value,byte(1 byte)>|
    <Field type,1 byte><Field Id,2 bytes><value,i16(2 bytes)>|
    <Field type,1 bytes><Field Id,2bytes><value,i32(4bytes)>|
    <FieldType,1byte><Field Id,2bytes><value,i64(8bytes)>|
    < Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 words section><value,nbytes>|
    (<Field type(struct),1byte><Field Id,2bytes>
        <Fieldtype,1byte><Field Id,2bytes><value,bool (1 byte)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 byte)>|
        <Field type, 1 byte>< Field Id, 2 bytes><value,i16(2 bytes)>|
        <Field type,1 byte><Field Id,2 bytes><value,i32(4 bytes)>|
        <Field type,1 bytes><Field Id, 2 bytes><value, i64(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value,nbytes>|
        …
    <FieldType(stop),1byte>)))
    …























set
<FieldType(set),1byte><FieldId,2bytes><set Element type, 1 byte><Number of elements in set, 4 bytes>
    <Field type, 1 byte><Field Id, 2 bytes><value, bool(1 byte)>|
    <Field type, 1 byte><Field Id,2bytes><value,byte(1byte)>|
    <Field type,1byte><Field Id,2bytes><value,i16(2bytes)>|
    < Field type, 1 byte><Field Id, 2 bytes><value,i32(4 bytes)>|
    <Field type,1 byte><Field Id,2 bytes><value,i64(8 bytes )>|
    <Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
    < Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> |
    (<Field type (struct), 1 byte><Field Id, 2 bytes>
        <Field type, 1 byte><Field Id, 2 bytes><value, bool(1 byte)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 word section)>|
        <Field type, 1 byte> <Field Id, 2 bytes> <value, i16(2 bytes)>|
        <Field type, 1 byte> <Field Id, 2 bytes> <value, i32(4 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, i64(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes ><value, double (8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> |
        …
    <Field type (stop), 1 byte>)
    …





















list
<Field type (list), 1 byte><Field Id, 2 bytes><element type in list, 1 byte><number of elements in list, 4 bytes >
    <Field type, 1 byte> <Field Id, 2 bytes> <value, bool(1 byte)> |
    <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 byte)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, i16(2 bytes)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i32 (4 bytes)>|
    <Field type, 1 byte> <Field Id, 2 bytes> <value, i64 (8 bytes) section)>|
    <Field type, 1 byte><Field Id, 2 bytes><value, double(8 bytes)>|
    <Field type, 1 byte><Field Id, 2 bytes><string type Field length, 4 bytes> <value, n bytes> |
    (<Field type (struct), 1 byte> <Field Id, 2 bytes>
        <Field type, 1 byte> <Field Id, 2 bytes ><value, bool(1 byte)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, byte(1 byte)>|
        <Field type, 1 byte><Field Id ,2bytes><value,i16(2bytes)>|
        <Field type,1byte><Field Id,2bytes><value,i32(4bytes)>|
        < Fieldtype,1byte ><Field Id, 2 bytes><value, i64(8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><value, double (8 bytes)>|
        <Field type, 1 byte><Field Id, 2 bytes><string type field length, 4 bytes><value, n bytes> |
        …
    <Field type (stop), 1 byte >)
    ...











enum









version number The
version field is determined by bytes 1-2, which must be 0x80, 0x01. A total of 2 bytes, converted to an integer as 0x8001????, and the mask 0xffff0000 and operation to get the version number.
0x8001???? -> 0x80 0x01 0x?? 0x??

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

message type The
message type field is determined by the fourth field, including call(1), reply(2), exception(3) and one-way(4) 4 message types

Method name length
The method name length field is determined by fields 5-8.

Method name The
method name field consists of the 9th-? field decision.

Serial number
4 bytes.



Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326218309&siteId=291194637