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