博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Serializable的必要条件
阅读量:4108 次
发布时间:2019-05-25

本文共 1526 字,大约阅读时间需要 5 分钟。

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:        UINT	m_nPenWidth;    public:        CArray
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); } }

转载地址:http://nxtsi.baihongyu.com/

你可能感兴趣的文章
Java中String使用及分析(UTF-8简单编码/解码器实现)
查看>>
Java中的流(Stream)(一)(BufferedInputStream)
查看>>
Lucene简介(一个 Demo 示例)
查看>>
Lucene简介(二)
查看>>
Lucene简介(一)
查看>>
Lucene简介(三)
查看>>
Lucene简介(四)(简单使用)
查看>>
Nutch简介(转1)
查看>>
Nutch简介(转2)
查看>>
Nutch简介(转3)
查看>>
Nutch简介(转4)(CommonCrawl)
查看>>
Nutch简介(转5)(Apache Nutch Tutorial 1.x)
查看>>
Java与C语言中的命令行参数获取
查看>>
Java中的Zip文件操作
查看>>
一个简单的工作者线程实现
查看>>
Maven使用(一)
查看>>
Spring基本使用(元素lookup-method使用)
查看>>
Spring基本使用(元素replaced-method使用)
查看>>
Spring基本使用(消息源MessageSource的使用/国际化)
查看>>
问题:使用jdbc时,resultSet始终不能获取第一行数据
查看>>