[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管理内存,对于需要支持并发的可以使用堆上的内存。
---
上面写得思路不太清晰!等完成代码重构后再叙。
- [C++设计]如何设计支持网络序列化的类
- Enum支持序列化吗以及设计模式策略枚举
- 如何设计一个支持高并发的高可用服务
- 网络协议的设计
- BP网络的设计
- MVC:如何设计多语言支持
- 支持SOA架构的设计
- 支持最小值的栈设计
- 如何设计一套较完善的网络投票系统
- 如何设计一个面向协议的 iOS 网络请求库
- 基于C#.NET的网络蜘蛛设计计划
- 层次化网络设计
- java类的设计(如何设计一个类)
- C-编译器的设计
- 如何使用C语言实现面向对象的设计
- 如何对C语言设计合适的程序调试方案
- C#.NET网络蜘蛛设计模式
- 网络音响的总体设计
- VS 内存不能read—堆栈空间解决栈溢出问题
- 表结构修改
- 使用Visual C#实现断点续传
- Ext.js核心函数详解
- 成功密码是1∶125
- [C++设计]如何设计支持网络序列化的类
- ora11g 压缩新特性
- 关于Xapian初学者的几个问题
- c++ dll
- objective-c整型值和浮点值应用中要注意的问题
- ubuntu 下解压,打包 命令
- 用C#实现基于TCP协议的网络通讯
- 经历错误,积累成功
- SVN服务端搭建