Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396758
  • 博文数量: 102
  • 博客积分: 1395
  • 博客等级: 中尉
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-05 18:09
文章分类

全部博文(102)

文章存档

2013年(25)

2012年(77)

分类: C/C++

2013-03-28 17:02:54

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类型的指针)。

阅读(2450) | 评论(0) | 转发(0) |
0

上一篇:MFC注册表编程

下一篇:网络编程

给主人留下些什么吧!~~