将对象保存至文件——CArchive

CArchive允许以一个二进制的形式保存一个对象的复杂网络,也可以再次装载它们,在内存中重新构造,这一过程叫作串行化/序列化(Serialization),简单的说,CArchive与CFile配合使用可以以二进制读取/保存数据到文件。

创建一个CArchive对象之前,你必须创建并成功打开一个CFile对象。另外,必须确信归档文件的装入(load)/存储(store)与文件的打开模式是兼容的,每一个文件只限于一个活动归档文件。

CArchive 对象的寿命只限于将对象写入文件或从文件读取对象的一次传递,也就是说,即使你使用了读写模式打开CFile对象,你也只能在load(store)结束并Close了CArchive对象后,才能重新对同一个CFile对象使用CArchive对象进行store(load)。

主要类型和CObject派生类都能支持CArchive进行读写,很多时候也需要重载CObject中的Serialize函数,蓝色部分为需要使用 <<  >> 时才需要做的步骤:

1. 继承CObject类

2. 重载CObject类的Serialize()成员函数

3. 在类的头文件中用Serialize的宏声明:DECLARE_SERIAL(CMyClass)

4. 定义默认(无参数)的构造函数

5. 在类文件中使用实现Serialize宏声明:IMPLEMENT_SERIAL(CMyClass, CObject, 1 /*版本号*/)

CArchive基本用法,其中 m_NetList 为一CListCtrl对象,在这里并没有重载Serialize:

存:

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

  

posted @ 2016-03-25 16:25  流忧  阅读(1442)  评论(0编辑  收藏  举报