MFC中的類序列化

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章