1. 该类需要从CObject类派生(可以是间接派生);
2. 在类中中进行DECLARE_SERIAL宏定义;
3. 类存在有缺省的构造函数;
4. 类中实现了Serialize()函数,并且在其中调用基类的序列化函数;
5. 使用IMPLEMENT_SERIAL宏指明类名及版本号;
比如下面CPerson类:
#ifndef _CPERSON_H
#define _CPERSON_H
class CPerson : public CObject
{
DECLARE_SERIAL(CPerson)
private:
CString _name;
int _age;
BOOL _gender;
public:
CPerson();
CPerson(CString name, int age, bool gender = true);
void printInfo();
virtual void Serialize(CArchive& ar);
};
#endif
CPP文件:
#include "stdafx.h"
#include "mfc_person.h"
IMPLEMENT_SERIAL(CPerson, CObject, 1)
CPerson::CPerson()
{
}
CPerson::CPerson(CString name, int age, bool gender)
{
_name = name;
_age = age;
_gender = gender;
}
void CPerson::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar<< this->_name<<this->_age<<this->_gender;
}
else
{
ar>> this->_name >> this->_age >> this->_gender;
}
}
void CPerson::printInfo()
{
if(_gender)
_tprintf("name: %s, male, %d\n",_name,_age);
else
_tprintf("name: %s, female, %d\n",_name,_age);
}
#include "stdafx.h"
#include "CArchiveTest.h"
#include "mfc_person.h"
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
setlocale(LC_ALL, "chs");
CPerson hxf(_T("hxff"), 28, FALSE);
CPerson hsf(_T("hsff"), 27, TRUE);
CFile oFile(_T("persons.dat"),CFile::modeCreate|CFile::modeWrite);
CArchive oar(&oFile, CArchive::store);
oar << &hxf << &hsf;
//oar.WriteObject(&tong);
//oar.WriteObject(&bai);
oar.Close();
oFile.Close();
CFile iFile(_T("persons.dat"), CFile::modeRead);
CArchive iar(&iFile, CArchive::load);
CPerson *p1, * p2;
//iar >> p1 >> p2;
p1 = (CPerson*)iar.ReadObject(RUNTIME_CLASS(CPerson));
p2 = (CPerson*)iar.ReadObject(RUNTIME_CLASS(CPerson));
p1->printInfo();
p2->printInfo();
delete p1;
delete p2;
return 0;
}
序列化是指对象将其状态保存在一个字节流中,并用该字节流重建对象。实例化实现了文档数据的保存和装入的幕后工作,MFC通过序列化实现了应用程序的文档读写功能。
序列化的基本思想是:一个类应该能够对自己的成员变量的数据进行读写操作,对象可以通过读操作而重新创建。即对象可以将其当前状态(由其成员变量的值表示)写入永久性存储体(通常指磁盘)中,以后可以从永久性存储体中读取(载入)对象的状态,从而重建对象。类的对象自己应该具备将状态值写入磁盘或从磁盘中读出的方法(即成员函数),这种对象的保存和恢复过程称为序列化。
文档数据的序列化操作通过CArchive类对象作为中介来完成。CArchive类对象由应用程序框架创建,并与用户正在使用的文件关联在一起。
CArchive类对象为读写CFile类对象中的可序列化数据提供了一种安全的缓冲机制,它们之间形成了如下关系:
Serialize()函数
一个可序列化的类必须有一个称作为序列化的成员函数Serialize(),文档的序列化在文档类的成员函数Serialize()中进行。
当用户选择文件菜单中的New,Open,Save和Save as 等菜单命令时,都会调用文档类的派生类的成员函数Serialize(),实现与序列化有关的操作。
CArchive类对象是单向的,即不能通过一个CArchive类对象既进行文档的保存,又进行文档的读取。通过调用CArchive类的成员函数IsStoring()来检索当前CArchive类对象的属性。如果CArchive类对象是用于写数据,函数IsStoring()返回TRUE;如果CArchive类对象是用于读数据,函数IsStoring()返回FALSE。
CArchive类对象使用重载的插入(<<)和提取(>>)操作符执行读和写操作。这种方式与cin和cout中的输入输出流非常相似,只是这里处理的是对象,而cin和cout处理的是ASCII字符串。
注意,MFC应用程序文件的序列化与其他不使用MFC序列化程序的文件格式并不兼容。若读写一般格式的文件,如TEXT,可直接使用CFile类及其派生类。
部分内容摘自网络: http://blog.163.com/xin_qing2010/blog/static/177737358201152693654941/