26 MFC序列化函数

文章目录

  • 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
26 MFC序列化函数_第1张图片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;
}

你可能感兴趣的:(mfc,c++)