现在的位置: 首页 > 综合 > 正文

MFC中的类序列化

2013年03月09日 ⁄ 综合 ⁄ 共 1413字 ⁄ 字号 评论关闭

MFC的对象保存到文件还是很方便的
主要使用CArchive类实现
需要被序列化的对象只需要从CObject类派生,并重写Serialize()成员函数就能方便的保存成员变量了

 

实例:  自定义的类Se

接口部分:

class Se :
 public CObject
{
public:
 Se(void);
 virtual ~Se(void);

//测试用变量,一个字符串,一个数字
 CString str;
 UINT uint;

//重写Serialize函数就能保存自己的变量
 virtual void Serialize(CArchive& ar);

//和普通类不同的地方,需要用DECLARE_SERIAL宏声明这个类是需要被序列化的
 DECLARE_SERIAL(Se);
};

 ************************************************************************************

实现部分:

#include "./se.h"

//和普通类不同的地方,如果这个类需要被序列化,加上IMPLEMENT_SERIAL这个宏
IMPLEMENT_SERIAL(Se,CObject,1)

Se::Se(void)
: str(_T(""))
, uint(0)
{
}

Se::~Se(void)
{
}

//重写Serialize函数就能保存自己的变量
void Se::Serialize(CArchive& ar)
{
//首先调用基类的Serialize()方法
 CObject::Serialize(ar);
 
//加上这个IsStoring()判断方法
//因为读取和写入的序列化方法都是这个,所以需要对读取和写入分别处理
 if(ar.IsStoring()){
//IsStoring()为真,表示当前为写入操作
  ar << str << uint;
 }else{
//IsStoring()为假,表示当前为读取操作
  ar >> str >> uint;
 }
}

***********************************************************************************

然后是在需要读取或写入序列化时的操作:

void Read()
{
 Se obj;
 CFile file("test.dat",CFile::modeRead);   //文件路径
 CArchive ar(&file,CArchive::load|CArchive::bNoFlushOnDelete);     //链接到文件,并设置为读取动作
 obj.Serialize(ar);   //对象序列化
 ar.Close();
 file.Close();

 CString temp;
 temp.Format("str->%s,uint->%d",obj.str,obj.uint);
 AfxMessageBox(temp);
}

void Write()
{
 Se obj;
 obj.SetValue();
 CFile file("test.dat",CFile::modeCreate|CFile::modeWrite);   //文件路径
 CArchive ar(&file,CArchive::store);    //链接到文件,并设置为写入动作
 obj.Serialize(ar);
 ar.Close();
 file.Close();
}

抱歉!评论已关闭.