[C++设计]如何设计支持网络序列化的类

来源:互联网 发布:xecdn32h编程软件 编辑:程序博客网 时间:2024/06/04 19:30


一些对象为了能够很方便地在网络上进行传输,就需要支持序列化和反序列化。


序列化示意图


如何设计一个易于序列化和反序列化的类呢?


MyClass{public:    int serialize(char* buf, const int64_t buf_len, int64_t& pos) const;    int deserialize(const char* buf, const int64_t data_len, int64_t& pos); private:    InnerClassA is_a;    InnerClassB *is_b;};myClassInstance->deserialize(const char* buf, const int64_t data_len, int64_t& pos){    is_a.deserialize(buf, data_len, pos);    is_b->deserialize(buf, data_len, pos);  // possible NULL exception}

序列化(serialize)比较容易实现,只要将MyClass的内部状态按照一定的协议写入到buf中即可。问题出在反序列化(deserialize)上。考虑在上例中如何恢复is_b的状态呢?如果这个参与反序列化的类是刚刚声明的,is_b指针可能根本没有初始化(它还指望deserialize给它初始化呢!),那么反序列化过程无法递归调用InnerClassB->deserialize()方法。


因此,一个支持反序列化的类中,如果它有成员类需要被序列化,那么这个成员类最好是一个实例,而不是一个指针。对于指针的情况,需要特别设计初始化函数,保证在执行反序列化之前这个指针指向了一个类实例。


每个类应该有一个缺省无参构造函数,有一个缺省初始正常状态。这种类在反序列化中首先被创建出来,相当于一个骨架,然后再在反序列化过程中利用反序列化提取出来的数据进行填充,最终形成一个完整的类。


特别要提到的是关于内存管理问题,对于不需要支持并发访问的类可以直接在栈上分配内存,对于线程级别的可以使用TSI管理内存,对于需要支持并发的可以使用堆上的内存。


---

上面写得思路不太清晰!等完成代码重构后再叙。


原创粉丝点击