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


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


序列化示意图


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


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管理内存,对于需要支持并发的可以使用堆上的内存。


---

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值