MFC文件处理机制
1.永久性对象与序列化
永久性对象:内存中的对象以文件的形式存入存储介质,而从介质中读入时,该对象又能恢复为原来的状态。
序列化:能使对象成为永久性对象的机制。
2.Serialize函数
Serialize函数是CObject类提供的虚函数,凡是希望具有序列化能力的类,都必须以CObject类或其派生类为基类。
由于应用程序的数据一般由文档对象来管理的,每当用户新建,打开或保存文档时,程序就会自动调用文档类对象的Serialize函数。
3.对象的序列化
对象的序列化的操作过程封装成了一个类CArchive,实际上把类信息表跟类对象打包成文件的工作就是由CArchive类的对象在Serialize函数中完成的。
Serialize函数原型:virtual void Serialize(CArchive &ar);
当需要存取或读取一个对象时,必须在Serialize函数中进行。例如某类A为永久化类,具体编码过程如下:
Class A::CObject //必须以CObject或其派生类为基类
{
DECLARE_SERIAL(A); //声明了序列化
private:
int m_X,m_Y;
...
public:
Serialize(CArchive&ar); //重写序列化虚函数
};
IMPLEMENT_SERIAL(A,CObject,1); //实现序列化
重写的序列化函数Serialize的实现:
A::Serialize(CArchive &Aar)
{
if(ar.IsStoring()) //存储数据
{
ar<
ar<
}
else //读取数据
{
ar>>m_X;
ar>>m_Y:
}
}
--------------------------------文件序列化实例-----------
Book.h
#include
class CBook : public CObject
{
DECLARE_SERIAL(CBook)
public:
CString m_strName;
CString m_strAuthor;
CString m_strPress;
public:
CBook()
{
// 要使CBook对象实现序列化,必须定义默认构造函数
}
CBook(CString strName, CString strAuthor, CString strPress)
{
m_strName = strName; // 书名
m_strAuthor = strAuthor; // 作者
m_strPress = strPress; // 出版社
}
void Serialize(CArchive &); // 重载基类的Serialize函数
};
Book.cpp
#include "Book.h"
IMPLEMENT_SERIAL(CBook, CObject, 1)
void CBook::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
{
ar << m_strName << m_strAuthor << m_strPress;
}
else
{
ar >> m_strName >> m_strAuthor >> m_strPress;
}
}
主程序
CBook book1("Programming Windows", "Charles Petzold", "Microsoft Press");
CBook book2("Programming Windows with MFC", "Jeff Prosise", "Microsoft Press");
int nCount = 2;
// 序列化
CFile fileStore(_T("mybooks.dat"), CFile::modeWrite | CFile::modeCreate);
CArchive arStore(&fileStore, CArchive::store);
CBook* pBooksStore[2] = { &book1, &book2 };
arStore << nCount;
for (int i=0; i
{
arStore << pBooksStore[i];
}
fileStore.Close();
// 反序列化
CFile fileLoad(_T("mybooks.dat"), CFile::modeRead);
CArchive arLoad(&fileLoad, CArchive::load);
arLoad >> nCount;
CBook* pBooksLoad = new CBook[nCount];
for (int i=0; i
{
arLoad >> pBooksLoad[i];
}
fileLoad.Close();
MFC序列化注意事项:
·要想使某一类型能被序列化,在它类型声明文件(头文件,Book.h)和类型定义文件(Book.cpp)中要分别使用DECLARE_SERIAL和IMPLEMENT_SERIAL宏。
·能被序列化的只能指针型,不能是值型(pBooksStore数组中包含的就是两个CBook类型的指针)。
阅读(2420) | 评论(0) | 转发(0) |