將對象保存至文件——CArchive

CArchive容許以一個二進制的形式保存一個對象的複雜網絡,也能夠再次裝載它們,在內存中從新構造,這一過程叫做串行化/序列化(Serialization),簡單的說,CArchive與CFile配合使用能夠以二進制讀取/保存數據到文件。網絡

建立一個CArchive對象以前,你必須建立併成功打開一個CFile對象。另外,必須確信歸檔文件的裝入(load)/存儲(store)與文件的打開模式是兼容的,每個文件只限於一個活動歸檔文件。函數

CArchive 對象的壽命只限於將對象寫入文件或從文件讀取對象的一次傳遞,也就是說,即便你使用了讀寫模式打開CFile對象,你也只能在load(store)結束並Close了CArchive對象後,才能從新對同一個CFile對象使用CArchive對象進行store(load)。spa

主要類型和CObject派生類都能支持CArchive進行讀寫,不少時候也須要重載CObject中的Serialize函數,藍色部分爲須要使用 <<  >> 時才須要作的步驟:code

1. 繼承CObject類對象

2. 重載CObject類的Serialize()成員函數blog

3. 在類的頭文件中用Serialize的宏聲明:DECLARE_SERIAL(CMyClass)繼承

4. 定義默認(無參數)的構造函數內存

5. 在類文件中使用實現Serialize宏聲明:IMPLEMENT_SERIAL(CMyClass, CObject, 1 /*版本號*/)it

CArchive基本用法,其中 m_NetList 爲一CListCtrl對象,在這裏並無重載Serialize:io

存:

CString szFileName = _T("c:\\1.dat");
CFile file;
if (file.Open(szFileName, CFile::modeCreate | CFile::modeWrite)) {

	CArchive ar(&file, CArchive::store);
	int nCount;

	nCount = m_NetList.GetItemCount();

	ar << nCount;
	for (int nID = 0; nID < nCount; nID++) {

		ar << m_NetList.GetItemText(nID, 1);
		ar << m_NetList.GetItemText(nID, 2);
		ar << m_NetList.GetItemText(nID, 6);
	}

	ar.Close();
}
file.Close();

取:

CString szFileName = _T("c:\\1.dat");
CFile file;
if (file.Open(szFileName , CFile::modeRead)) {
 
    CArchive ar(&file, CArchive::load);
 
    int nCount, nID;
    CString tempS;
 
    m_NetList.DeleteAllItems();
 
    ar >> nCount;
    for (int i = 0; i < nCount; i++) {
 
        nID = m_NetList.InsertItem(i, _T(""));
 
        ar >> tempS;
        m_NetList.SetItemText(nID, 1, tempS);
        ar >> tempS;
        m_NetList.SetItemText(nID, 2, tempS);
        ar >> tempS;
        m_NetList.SetItemText(nID, 6, tempS);
    }
 
    ar.Close();
    }
}
file.Close();
相關文章
相關標籤/搜索