简介
在介绍完IO流以后,基本上就知道了服务端和客户端是如何建立链接以及进行数据传输的,但是对于如何进行数据的序列化和反序列化,将在本文进行详 细记介绍。
协议层的抽象类方法叫做:TProtocol,在包org.apache.thrift.protocol下。其中定义了协议的所有方法
TProtocol的UML图:

分别定义了简版json协议、json传输协议、二进制传输协议、密集型(对int和long进行了长度压缩,采用了zigzag 编码)详情我会在后面继续介绍。
子类是我司封装的方法和官方的简版传输协议(对消息体进行了深度压缩)
先介绍下协议层需要完成的内容,定义了一个序列化和反序列化的协议:
|
|
需要注意的是在write方法里面,并没有wirte i32、bool、long、i16、double等并没有writeEnd方法,因为这些都是定长的
在这个协议里面定义了一个请求是如何被请求端打包,并且被服务端解包的。
在这个协议中有一个类叫做TMessage。可以简单来看一下源码:
下面来详细解释下协议层的使用。
首先来看其中定义的方法。
TTransport:这个是传输层,Thrift传输层—I/O操作
剩下的就是一个如何来构造一次传输的内容。
先看分类,整体上分为两个大类别,每一个方法都有写和读的方法在对应着。先来说说写方法。
A
首先是定义了一个方法调用的开始writeMessageBegin,这个方法中写入TMessage这个对象,其中包含了调用的方法名字,调用类型(目前看到的都是CALL),以及当前消息的序列(可能与传输层有关)。
B
根据函数中定义的参数顺序,依次调用相应的写方法和写结束方法(只有不可知长度的类型才需要结束方法)。写入字段的消息类型和消息长度,以及消息顺序号。
比如如何写入string这个类型
|
|
再比如如何写入map这个类型
在写入之前用到的一些类型:
其中引用了一个新的对象教TType。
下面是正式的写入map这个对象,一共有两种写入方法,分别为标准写入和Tuple写入(简版)?
下面对比两种的写入的不同点:
标准写入
下面是其中的一段field的代码
简单版本
可见简版的写入相对于标准更节省空间。因此传输效率更高。我司采用的是标准传输协议。
在读取的时候采用的是对应的方法
标准协议:
简单版本
C
然后writeMessageEnd,完成了消息的写入
整体上来说,如果想要对代码进行缩减或者是更改,需要注意的地方很多,比如读写的顺序。而且在不断的发版过程中的变量顺序调整也会影响数据的序列化和反序列化。
因此借用官方的一句话: