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