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();
}