现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

CFile、CArchive及Serialize()的关系

2012-12-13 11:52 工业·编程 ⁄ 共 1052字 ⁄ 字号 暂无评论

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

}

给我留言

留言无头像?