Serializable的必要条件
来源:互联网 发布:注册域名几天可以交易 编辑:程序博客网 时间:2024/04/30 13:21
Serializable的必要条件[转自《深入浅出MFC》,侯俊杰]
欲让一个对象有Serialize能力,它必须派生自一个Serializable类。一个类意欲成为Serializable,必须有下列五大条件;至于其原因,前面的讨论已经全部交待过了。
1. 从CObject派生下来。如此一来可保有RTTI、DynamicCreation等机能。
2. 类的声明部分必须有DECLARE_SERIAL宏。此宏需要一个参数:类名称。
3. 类的实现部分必须有IMPLEMENT_SERIAL宏。此宏需要三个参数:一是类名称,三是schema no.。
4. 改写Serialize虚函数,使它能够适当地把类的成员变量写入文件中。
5. 为经类加上一个default构造函数(也就是无参数之构造函数)。这个条件常为人所忽略,但它是必要的,因为若一个对象来自文件,MFC必须先动态创建它,而且在没有任何参数的情况下调用其构造函数,然后才从文件中读出对象数据。
如此,让我们再复习一次本例的CStroke,看看是否符合上述五大条件:
// in SCRIBBLEDOC.H class CStroke : public CObject // 派生自CObject(条件1) { public: CStroke(UINT nPenWidth); protected: CStroke();// 拥有一个default constructor(条件5) DECLARE_SERIAL(CStroke)// 使用SERIAL宏(条件2) protected: UINTm_nPenWidth; public: CArray<CPoint, CPoint> m_pointArray; public: virtual void Serialize(CArchive& ar); // 改写Serialize函数(条件4) }; // in SCRIBBLEDOC.CPP IMPLEMENT_SERIAL(CStroke, CObject, 1)// 使用SERIAL宏(条件3) CStroke::CStroke()// 拥有一个default constructor(条件5) { // This empty constructor should be used by serialization only } void CStroke::Serialize(CArchive& ar) // 改写Serialize函数(条件4) { CObject::Serialize(ar); // 手册上告诉我们最好先调用此函数, // 当前MFC版本中它是空函数,所以不调用也没关系 if (ar.IsStoring()) { ar << (WORD)m_nPenWidth; m_pointArray.Serialize(ar); } else { WORD w; ar >> w; m_nPenWidth = w; m_pointArray.Serialze(ar); } }
- Serializable 的必要条件
- Serializable的必要条件
- 项目上线的必要条件
- 死锁的四个必要条件
- 地下黑客的必要条件
- 产生死锁的必要条件
- 死锁的四个必要条件
- 死锁的四个必要条件
- 死锁的四个必要条件
- 成功的必要条件
- 死锁的四个必要条件
- 软件产品发布的必要条件
- 死锁的四个必要条件
- 死锁的四个必要条件
- java的一些必要条件!
- 死锁的四个必要条件
- scrollLeft的必要条件
- 死锁的四个必要条件
- DEDECMS网站数据快速迁移、数据库备份和还原
- java生成newid随机数
- C++的XML编程经验――LIBXML2库使用指南
- opencv cvhog详解
- 裸色调的旋律
- Serializable的必要条件
- jQuery的.live()和.die()
- centos 6.3 服务器环境配置(apach+php+mysql+phpmyadmin)
- 17种正则表达式
- Flex ArrayCollection 中的排序、过滤
- [Unity3D]在Unity3D中实现简单的碰撞检测
- [sicily online]1097. LED Modding
- du熊学斐波那契I
- XML循环画刷