CFile、CArchive及Serialize()的关系。

来源:互联网 发布:139端口是什么服务 编辑:程序博客网 时间:2024/05/21 22:27

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

}