前面的文章也提到了,看了一些服务器的大师级的代码,SmartStruct和自定义序列化的方式都有,如果单单只用C结构体作为语意数据载体固然可以,但很多网友也提出了很多质疑,最大的缺陷就是灵活性欠佳,诚然如此。
这段时间沉下了心,好好写了一些类主要有:
ObjectStream
StreamBuffer
SerializeMap
PacketStruct
...
等等,有了前人的经验,似乎也算比较顺利,一个个从基本的数字,
到数组,到char[] (很多资料也称之为:raw 二进制序列)
再到STL 的一系列容器的序列化工作都实现了
其中大量使用了模版类的泛型设计,不必要求一个可序列化的类必须继承某某基类,只需要具备以下:
SerializeTag ComputeTag();
bool Read(ObjectStream& stream);
bool Write(ObjectStream& stream);
DWORD GetLength(ObjectStream& stream);
bool operator==(const PacketHeader &other) const;
五个方法就可以了,如果随意给你一个事先定义好的类,可以实现序列化吗?当然可以,只需要写出该类的
Wrapped Proxy,再添加这5个方法,就能通过 ObjectStream 和 StreamBuffer 实现该类的序列化了
这些是写完成了,回头看看自己已经写好的网络逻辑模块,犯愁了。
唉……,加入序列化,相当于高层次的通讯协议全都变了,包结构要改,所有的业务逻辑通讯代码随之要改。
之前的工作…… 又要写大量的重构代码了。
重构真是件痛苦的事情。
最坏的打算把之前的一些逻辑东西按现有思路重写一遍嘛,二次加工也许能应祸得福,把破旧看不过眼的地方重整理的更漂亮,好比重新装修升级一样
现在,只能告诉自己一件事,沉下心,沉注气。