CArchive序列化

11 篇文章 0 订阅
实现序列化的类必须满足下列条件:

   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()函数 <==>  CArchive类对象<==> CFile类对象<==>磁盘文件

一个可序列化的类必须有一个称作为序列化的成员函数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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值