说明
序列化就是用来保存各种对象状态的程序,一般继承CObject可以使用其序列化的程序,但一般设计一个类完全没有必要继承CObject,所以可以自己写一个类的序列化程序。
程序
在网上找的一个CObject的程序上改出来的。
H文件
#pragma once
// CArwen command target
class CArwen
{
private:
public:
CArwen(void);
CArwen(CString name1, int age1, CString sex1);
virtual ~CArwen(void);
virtual void Serialize(CArchive& ar);
friend CArchive& operator<<(CArchive& ar, CArwen & it);
friend CArchive& operator>>(CArchive& ar, CArwen & it);
friend CArchive& operator<<(CArchive& ar, CArwen * it);
friend CArchive& operator>>(CArchive& ar, CArwen * it);
CString name;
int age;
CString sex;
};
CPP文件
#include "pch.h"
#include "CArwen.h"
#include <string>
// CArwen
CArwen::CArwen(void)
{
}
CArwen::CArwen(CString name1, int age1, CString sex1)
{
this->name = name1;
this->age = age1;
this->sex = sex1;
}
CArwen::~CArwen(void)
{
}
void CArwen::Serialize(CArchive& ar)
{
// 接下来再进行派生类部分数据的串行化
if (ar.IsStoring()) // 判断是否是写磁盘
{ // 写串行化
ar << name << age << sex;
}
else // 读串行化
{
ar >> name >> age >> sex;
}
}
// CArwen member functions
CArchive & operator<<(CArchive & ar, CArwen & it)
{
// TODO: 在此处插入 return 语句
if (ar.IsStoring())
{
ar << it.name << it.age << it.sex;
}
return ar;
}
CArchive & operator>>(CArchive & ar, CArwen & it)
{
// TODO: 在此处插入 return 语句
if (ar.IsLoading())
{
ar >> it.name >> it.age >> it.sex;
}
return ar;
}
CArchive & operator<<(CArchive & ar, CArwen * it)
{
// TODO: 在此处插入 return 语句
if (ar.IsStoring())
{
ar << it->name << it->age << it->sex;
}
return ar;
}
CArchive & operator>>(CArchive & ar, CArwen * it)
{
// TODO: 在此处插入 return 语句
if (ar.IsLoading())
{
ar >> it->name >> it->age >> it->sex;
}
return ar;
}
使用使用起来和继承CObject的序列化程序完全一致。
void CMFCApplicationDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CArwen* ren = new CArwen;
ren->name=CString(_T("123"));
ren->age=20;
ren->sex=CString(_T("boy"));
CFile file;
if (!file.Open(_T("person.ser"), CFile::modeCreate | CFile::modeWrite))
{
return;
}
CArchive arStore(&file, CArchive::store);
arStore << ren;
arStore.Close();
file.Close();
}
void CMFCApplicationDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CArwen * ren = new CArwen;
// TODO: Add your control notification handler code here
CFile file;
if (!file.Open(_T("person.ser"), CFile::modeRead))
{
return;
}
CArchive arLoad(&file, CArchive::load);
arLoad >> ren;
arLoad.Close();
file.Close();
}
最后
学习记录。