MFC 序列化

MFC文件处理机制
1、永久对象与序列化
永久性对象:内存中的对象以文件的形式存入存储介质,而介质中读入时,该对象又能恢复为原来的状态
序列化:能使对象成为永久性对象的机制;
2、Serialize函数
Serialize函数是CObject类提供的虚函数,凡是希望具有序列化能力的类,都必须以CObject类或其派生类为基类。
由于应用程序的数据一般有文档对象来管理的,每当用户新建,打开或保存文档时,程序就回自动调用文档类对象的Serialize函数。
3、对象的序列化
对象的序列化的操作过程封装成了一个类CArchive,实际上把类信息表跟类对象打包成文件的工作就是由CArchive类的对象在Serialize函数中完成的。
Serialize函数的原型:virtual void Serialize(CArchive &ar);
当需要存取或读取一个对象时,必须在Serialize中进行,例如某类A为永久化类,具体编码过程如下:
4、添加序列化的声明宏:DECLARE_SERIAL(CStudent)和实现宏IMPLEMENT_SERIAL(CStudent,CObject,1)

5、一个类的完整的序列化,要求父类,成员变量,都要支持序列化

下面是简单的实例:对象序列化

(Arwen.h)

#pragma once

// CArwen command target

class CArwen : public CObject
{
private:
	CString name;
	int age ;
	char sex;
public:
	DECLARE_SERIAL(CArwen)
	CArwen(void);
	CArwen(CString name1, int age1, char sex1);
	virtual ~CArwen(void);
	virtual void Serialize(CArchive& ar);
	void setname(CString pName);
	CString getName();
	void setAge(int age);
	int  getAge();
	void setSex(char sex);
	char getSex();
};

(Arwen.cpp)

// Arwen.cpp : implementation file
//

#include "stdafx.h"
#include "Serialize.h"
#include "Arwen.h"
#include <string>

// CArwen
IMPLEMENT_SERIAL(CArwen,CObject,2)
CArwen::CArwen(void)
{
}

CArwen::CArwen(CString name1, int age1, char sex1)
{
	this->name = name1;
	this->age = age1;
	this->sex = sex1;
}

CArwen::~CArwen(void)
{
}

void CArwen::setname(CString pName)
{
	this->name = pName;
}

CString CArwen::getName()
{
	return this->name;
}

void CArwen::setAge(int age)
{
	this->age = age;
}

int CArwen::getAge()
{
	return this->age;
}

void CArwen::setSex(char sex)
{
	this->sex = sex;
}

char CArwen::getSex()
{
	return this->sex;
}

void CArwen::Serialize(CArchive& ar)
{
    CObject::Serialize(ar);
	// 接下来再进行派生类部分数据的串行化  
	if (ar.IsStoring()) // 判断是否是写磁盘  
	{    // 写串行化  
		ar << name << age <<sex;  
	}  
	else // 读串行化  
	{  
		ar >>name >> age >>sex;  
	}
}
// CArwen member functions
void CSerializeDlg::SerializeWrite()
{
	// TODO: Add your control notification handler code here
	CArwen* ren = new CArwen;
	CString Temp;
	GetDlgItem(IDC_EDIT2)->GetWindowText(Temp);
	ren->setname(Temp);
	//ren->setAge(20);
	//ren->setSex(_T('boy'));

	CFile file;
	if (!file.Open(_T("person.ser"),CFile::modeCreate|CFile::modeWrite))
	{
		return;
	}
	//CFile file(_T("person.ser"),CFile::modeCreate|CFile::modeReadWrite);

	CArchive arStore(&file,CArchive::store);
	//Serialize(arStore);
	//arStore.WriteObject(&ren);
	//arStore.Flush();
	//ren.Serialize(arStore);
    arStore << ren;
	arStore.Close();
	file.Close();
}

void CSerializeDlg::SerializeRead()
{
	CArwen * ren = new CArwen;
	// TODO: Add your control notification handler code here
	CFile file;
	if (!file.Open(_T("person.ser"),CFile::modeRead))
	{
		return;
	}
	//CFile file(_T("person.ser"),CFile::modeReadWrite);
	
	//file.SeekToBegin();

	CArchive arLoad(&file,CArchive::load);

	//ren->Serialize(arLoad);
	//ren = (CArwen*)arLoad.ReadObject(RUNTIME_CLASS(CArwen));
	arLoad >> ren;
	arLoad.Close();
	file.Close();
	CString name = ren->getName();
	int age = ren->getAge();
	m_ReadEdit.SetWindowText(name);
	m_ReadEdit.SetDlgItemInt(IDC_EDIT1,age);

	//wchar_t* pch = name.GetBuffer(0);
	
	
	
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值