CFile是MFC文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并直接地通过派生类支持文本文件和内存文件。CFile与CArchive类共同使用,支持MFC对象的串行化。
CArchive允许以一个永久二进制(通常为磁盘存储)的形式保存一个对象的复杂网络,它可以在对象被删除时,还能永久保存。可以从永久存储中装载对象,在内存中重新构造它们。使得数据永久保留的过程就叫作“串行化”。 当构造一个CArchive对象时,要把它附加给表示一个打开文件的类CFile(或派生类)的对象上。还要指定归档文件将用于装载还是存储。
一个实现了串行化的类一般会在Serialize()函数中调用CArchive类对象ar来对其相关联的CFile进行读写。以下就是一个简单位的例子:
class example : public CObject
{
DECLARE_SERIAL(CYourClass) //很重要一定要加上
public:
example(){};
virtual void Serialize(CArchive& ar);
void LoadData();
void SaveData();
protected:
CString m_strA;
int m_iB;
};
在实现文件中:
#define FileName _T("MyFile")
IMPLEMENT_SERIAL(example, CObject, 1)
void example::Serialize(CArchive& ar)
{
if(ar.IsLoading())
{
//从文件中读取数据到内存中,比如
ar > > m_strA;
ar > > m_iB;
}
else if(ar.IsStoring())
{
ar < < m_strA;
ar < < m_iB;
}
}
void LoadData()
{
CFile file;
CFileException fe;
if(file.Open(FileName, CFile::typeBinary | CFile::modeRead, &fe))
{
CArchive ar(&file, CArchive::load);
Serialize(ar);
}
}
void SaveData()
{
CFile file;
CFileException fe;
//file exist with read & write permissions
if(file.Open(FileName, nFlags/*这个参数根据需要设定*/, &fe))
{
CArchive ar(&file, CArchive::store);
Serialize(ar);
}
}