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)
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);
}