文章目录
- Serialize
- 对于存储文件的序列化
Serialize
Serialize 是一个在 MFC (Microsoft Foundation Classes) 中常用的函数或概念。它用于将对象的数据进行序列化和反序列化,便于在不同的场景中保存、传输和恢复对象的状态。
在 MFC 中,Serialize 函数通常是在派生自 CObject 的类中实现的。通过重写 Serialize 函数,可以定义如何将对象的数据转换成二进制格式(序列化),以及如何将二进制数据还原为对象的状态(反序列化)。
- 以下是一个基本示例:
void CMyObject::Serialize(CArchive& ar) { if (ar.IsStoring()) { // 将对象的数据写入存档 ar << m_member1; ar << m_member2; // ... } else { // 从存档中读取数据并恢复对象的状态 ar >> m_member1; ar >> m_member2; // ... } }
在上述示例中,如果 CArchive 的存储模式为存储(IsStoring 返回 true),则将对象的数据写入存档;否则,在加载模式下(IsStoring 返回 false),从存档中读取数据并恢复对象的状态。
通过使用 Serialize 函数,您可以方便地将对象的状态保存到磁盘文件、数据库或网络流中,以及从这些介质中恢复对象的状态。
对于存储文件的序列化
CModeItem.h
class CModeItem :public CObject
{
//添加序列号功能
DECLARE_SERIAL(CModeItem)
public:
CModeItem();
~CModeItem();
//序列号函数
void Serialize(CArchive& ar);
CString m_sModeName;//姓名
int m_nAge;//年龄
CString m_sSex;//性别
int m_nSize;//用来存储指针的大小
};
//CTypedPtrArray 是 MFC 中的一个模板类,用于存储指针的动态数组。
//CObArray 是 MFC 中的另一个类,它是一个基于指针的对象数组,可以用来存储任意类型的指针
typedef CTypedPtrArray <CObArray, CModeItem*> CModeItems;
CModeItem.cpp
#include "pch.h"
#include "CModeItem.h"
IMPLEMENT_SERIAL(CModeItem, CObject, 1 )
//IMPLEMENT_SERIAL 是一个在 MFC 中使用的宏,用于简化类的序列化实现。
//IMPLEMENT_SERIAL 宏用于在派生自 CObject 的类中实现对象的序列化。
//通过使用该宏,您可以自动生成 Serialize 函数的实现代码,而无需手动编写。
//IMPLEMENT_SERIAL(class_name, base_class_name, schema_version)
//class_name:要实现序列化的类的名称。
//base_class_name:基类(通常为 CObject)的名称。
//schema_version:序列化模式的版本号,用于支持向后兼容性。
CModeItem::CModeItem()
{
m_sModeName = _T("");
m_nAge = 0;
m_sSex = _T("");
m_nSize = sizeof(CModeItem);
}
CModeItem::~CModeItem()
{
}
void CModeItem::Serialize(CArchive & ar)
{
UINT uVer = 1;
CString sTag = _T("");//用来存储更多的标志,便于扩展
//CArchive::IsLoading或CArchiv::IsStoreing来确定存档是正在加载还是正在存储。
//Serialize由CArchive ::ReadObject和CArchive::WriteObject调用。
//这些函数与C存档插入运算符( << )和提取运算符( >> )相关联。
if (ar.IsLoading)//正在加载
{
ar >> uVer >> m_sModeName >> m_nAge >> m_sSex;//提起
}
else
{
ar << uVer << m_sModeName << m_nAge << m_sSex;//插入
}
}
theApp.h
theApp.cpp
int CSerializeDemoApp::InitData()
{
TCHAR exeFullPath[MAX_PATH];
GetModuleFileName(NULL, exeFullPath, MAX_PATH);
m_sRunPath = exeFullPath; //当前运行路径
SetCurrentDirectory(m_sRunPath);
int iFind = m_sRunPath.ReverseFind('\\');
if (-1 != iFind)
{
m_sRunPath = m_sRunPath.Left(iFind);
CreateDirectory(m_sRunPath + _T("\\Log"), NULL);
CreateDirectory(m_sRunPath + _T("\\sys"), NULL);
CreateDirectory(m_sRunPath + _T("\\DATA"), NULL);
}
//lpszSection:要读取的配置文件的节(section)名称。
//lpszEntry:要读取的配置文件中的条目(entry)名称。
//nDefault:如果无法找到指定的配置文件或条目,则返回的默认值。
m_nCurMode= GetProfileInt(_T("学生信息"), _T("当前学生"), 0);
LoadMode();
return 0;
}
int CSerializeDemoApp::LoadMode(void)
{
RemoveAllMode();
CString sFile = m_sRunPath + _T("\\sys\\mode.student");
CFile oFile;
if (oFile.Open(sFile, CFile::modeRead))
{
CString sClass,nID;//以后可能要扩展的
CArchive ar(&oFile, CArchive::load);
try {
m_oModes.Serialize(ar);
}
catch (...)
{
}
ar.Close();
oFile.Close();
}
return 0;
}
int CSerializeDemoApp::RemoveAllMode(void)
{
for (int n = m_oModes.GetSize() - 1; n >= 0; --n)
{
delete m_oModes[n];
}
m_oModes.RemoveAll();
return 0;
}
int CSerializeDemoApp::SaveMode(void)
{
CString sFile = m_sRunPath + _T("\\sys\\mode.student");
CFile oFile;
if (oFile.Open(sFile, CFile::modeWrite | CFile::modeCreate))
{
CString sClass, nID;//以后可能要扩展的
CArchive ar(&oFile, CArchive::store);
try {
m_oModes.Serialize(ar);
}
catch (...)
{
}
ar.Close();
oFile.Close();
}
return 0;
}