- 5
- 0
- 约 6页
- 2016-06-11 发布于重庆
- 举报
Thrift之TProtocol类体系原理及源码详细解析之类继承架构分析
这部分相关的类主要实现与协议相关的内容,这里说的协议是指对数据传输格式封装的协议,实现不同的协议来适合不同场景下的数据传输,因为在不同的场景下不同协议对于数据传输来说效率有很大的差别。下面是这个部分相关类的类关系图:
?
由以上类图可以发现所有的协议类都从TProtocol类直接或间接继承,每一个协议类都有一个对应的生产对象工厂(协议工厂)。TProtocol是一个抽象的类,不能直接使用的,它有一个直接子类默认实现了所有方法(空实现),如果我们需要定义自己的数据传输协议可以直接从这个类继承。
第一节?类继承架构分析
为什么需要对这部分的类继承架构进行分析了?上面不是有很清楚的类继承关系图了吗?但是Facebook在实现时并不是简单的这样继承下来就可以了,Facebook为了后期协议的可扩展性和允许其他组织、团队或个人实现自己的数据传输(主要是数据格式的封装)协议,里面多加了一层继承关系,就是类图中的TVirtualProtocol类,从类的名称可以看出这是一个虚的协议。怎样理解这个虚的协议了?通过阅读代码我觉得可以这样理解:因为它定义为一个模板类, 这个模板类有两个参数,一个用于数据传输的真正协议,一个是用来继承的,它本身没有对协议具体内容做实现,所以说它是一个虚的协议类。下面我们对这个类继承架构结合代码实现来具体分析。
1?抽象类TProtocol和默认实现类TProtocolDefaults
抽象类对于每一种数据类型都提供了读写的开始和介绍的方法,这里读写方法应该是针对网络IO读写,不过真正实现网络读写还不是这里的方法,这里方法主要处理数据,例如对数据格式做调整。真正实现网络IO读写是下一章介绍的TTransport相关类实现的,那里还会对传输的方式做相应控制,例如是否压缩。
除了具体的数据类型有写入和读取的方法,消息也是需要通过网络传递,所以也定义了消息的传输读写方法。当然还定义了一些公用的功能,如跳过某一个结构不读、大小端数据格式调整、主机字节序和网络字节序的相互转换等。
(1)首先定义纯虚函数:
1 virtual uint32_t writeMessageBegin_virt(const std::string name,
2
3 const TMessageType messageType, const int32_t seqid) = 0;
4
5 virtual uint32_t writeMessageEnd_virt() = 0;
6
7 virtual uint32_t writeStructBegin_virt(const char* name) = 0;
8
9 virtual uint32_t writeStructEnd_virt() = 0;
?
(2)然后定义调用相应纯虚函数的函数:
1 uint32_t writeMessageBegin(const std::string name, const TMessageType messageType, const int32_t seqid) {
2
3 T_VIRTUAL_CALL();//打印调用日志函数
4
5 return writeMessageBegin_virt(name, messageType, seqid);
6
7 }
8
9 uint32_t writeMessageEnd() {
10
11 T_VIRTUAL_CALL();
12
13 return writeMessageEnd_virt();
14
15 }
16
17 uint32_t writeStructBegin(const char* name) {//写结构体开始
18
19 T_VIRTUAL_CALL();
20
21 return writeStructBegin_virt(name);
22
23 }
24
25 uint32_t writeStructEnd() {//写结构体结束
26
27 T_VIRTUAL_CALL();
28
29 return writeStructEnd_virt();
30
31 }
?
(3)其他公共函数
?
1 uint32_t skip(TType type) {
2
3 T_VIRTUAL_CALL();
4
5 return skip_virt(type);//跳过数据类型
6
7 }
8
9 virtual u
原创力文档

文档评论(0)