当前位置: 首页 > news >正文

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
在这里插入图片描述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;
}
http://www.lryc.cn/news/110326.html

相关文章:

  • GC 深入(小白,对gc有一个进一步的了解)
  • CSS前端面试
  • VB+SQL餐饮管理系统设计与实现
  • React入门学习笔记2
  • Palo Alto Networks® PA-220R 下一代防火墙 确保恶劣工况下的网络安全
  • 架构训练营学习笔记:5-2 负载均衡架构
  • 二叉树的性质、前中后序遍历【详细】
  • 涨姿势了,有意思的气泡 Loading 效果
  • 单片机中断系统
  • 二、JVM-深入运行时数据区
  • 随机验证码vue实现,登录验证码随机验证码数字和字母类型的
  • xlrd与xlwt操作Excel文件详解
  • A Survey of Embodied AI: From Simulators to Research Tasks 论文阅读
  • spark-sql数据重复之File Output Committer问题
  • 面试热题(前中序遍历构建树)
  • 美术:贴图
  • [MAUI]模仿微信“按住-说话”的交互实现
  • windows开机运行jar
  • 使用DockerFile一键创建自定义linux开发环境
  • “深入探索JVM:解密Java虚拟机的工作原理“
  • 【华为OD机试】数字最低位排序【2023 B卷|100分】
  • 【Odoo16前端源码分析】xml模板的加载
  • Open3D (C++) 计算矩阵的广义逆
  • 11.物联网操作系统内存管理
  • 举办活动发布会,如何得到媒体支持?
  • 1139 First Contact(unique函数,string.substr()函数)
  • Python元编程-装饰器介绍、使用
  • python进程池的使用
  • Dockerfile构建lamp镜像
  • LeetCode724. 寻找数组的中心下标