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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/59835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【高光谱图像的去噪算法】通过全变异最小化对受激拉曼光谱图像进行去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python二维数组的坑:vis = [[0]*m] * n

先来看&#xff0c;vis [[0]*m] * n&#xff0c; vis2 [[0]*m for _ in range(n)]有什么区别&#xff1f; 这两行代码都是用来创建二维列表&#xff08;或矩阵&#xff09;&#xff0c;但它们之间有一个关键的区别在于列表的复制方式。 vis [[0]*m] * n&#xff1a; 这种方…

SQL-每日一题【1193. 每月交易 I】

题目 Table: Transactions 编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 1.题目要求我们查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数…

工作方法论—马斯克的任务分解法

总结&#xff1a;动手做一个工作之前&#xff0c;请先对它进行任务&#xff0c;然后高效执行每一个原子操作 德雷克公式&#xff1a; 如果大家对德雷克公式有些陌生&#xff0c;我们再来看一个 IT 人怎样用任务分解的思路解决问题。 我们都知道埃隆马斯克&#xff08;Elon Mu…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--搭建Vue 前端工程[一]

文章目录 SSM--搭建Vue 前端工程--项目基础界面实现功能01-搭建Vue 前端工程需求分析/图解代码实现搭建Vue 前端工程下载node.js LTS 并安装: node.js 的npm创建Vue 项目使用idea 打开ssm_vue 项目, 并配置项目启动 Vue3 项目目录结构梳理Vue3 项目结构介绍 配置Vue 服务端口El…

Python(六十六)字典生成式

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CI/CD—Docker初入门学习

1 docker 了解 1 Docker 简介 Docker 是基于 Go 语言的开源应用容器虚拟化技术。Docker的主要目标是build、ship and run any app&#xff0c;anywhere&#xff0c;即通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;达到应用组件级别的一次封装、到处运…

获取SQL语句表名,判断DDL类型

1.在maven中引入jsqlparser依赖 <!--sql语句解析--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.4</version></dependency>2.解析SQL语句具体代码 此代码解析…

Redis 安装以及配置隧道连接

目录 1.CentOS 1. 安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Ubuntu 1. 安装Redis 2. Redis 启动/停⽌ 3. 操作 Redis 3.开启隧道 3.1 Xshell 配置隧道 3.2 windTerm 配置隧道 3.3 FinalShell配置隧道 4.可视化客户端连接 Another Redis Desktop Manager 1.Cen…

【Spring Cloud一】微服务基本知识

系列文章目录 微服务基本知识 系列文章目录前言一、系统架构的演变1.1单体架构1.2分层架构1.3分布式架构1.4微服务架构1.5分布式、SOA、微服务的异同点 二、CAP原则三、RESTfulRESTful的核心概念&#xff1a; 四、共识算法 前言 在实际项目开发过程中&#xff0c;目前负责开发…

《向量数据库指南》——怎么做VectorDBBench能发展成为ClickBench一样的行业标准?

目录 设计目标 真实负载模拟 广泛采用 持续更新和维护 社区支持和参与 VectorDBBench要像ClickBench一样成为行业标准,需要从多个方面进行改进和完善。以下是一些可行的方法: 设计目标 VectorDBBench应该具有灵活、可扩展的模块化架构,支持多种向量数据库系统,以及自定…

【Jmeter】 Report Dashboard 生成html图形测试报告

目录 背景 生成图形报告的方式 1、直接使用一个已存在的 CSV文件生成 2、负载测试完成后自动生成 使用示例 报告内容详情 测试报告摘要图 响应时间随时间变化曲线 活跃线程随时间变化曲线 I/O&#xff08;Bytes&#xff09;随时间变化曲线(忽略事务控制器示例结果) …

将程序打包成单一一个可执行文件

最近做了一个界面交互渲染的小项目&#xff0c;项目主要的功能是通过TCP接收数据然后在界面中渲染出对应的状态。由于用户的最大需求是炫酷&#xff0c;于是为了方便实现特殊的交互逻辑&#xff0c;我选择用freeglut自行实现了界面的交互和渲染&#xff0c;又用OpenCV做了部分图…

[openCV]基于拟合中线的智能车巡线方案V1

import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表"""newDir d…

hcip的mgre和ospf实验

题目 拓扑图 一、配置环回和IP地址 R1 < Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 64.1.1.1 24 Aug 4 2023 18:56:07-08:00 r1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol…

DNS部署与安全详解(上)

文章目录 一、DNS二、域名组成1. 域名组成概述2. 域名组成 三、监听端口四、DNS解析种类1. 按照查询方式分类&#xff1a;2. 按照查询内容分类&#xff1a; 五、DNS服务器搭建过程1. 先确保服务器的IP地址是固定的2. 安装DNS软件 一、DNS DNS全称Domain Name Service&#xff0…

人工智能安全-3-噪声数据处理

0 提纲 噪声相关概述噪声处理的理论与方法基于数据清洗的噪声过滤主动式过滤噪声鲁棒模型1 噪声相关概述 噪声类型: 属性噪声:样本中某个属性的值存在噪声标签噪声:样本归属类别关于噪声分布的假设:均匀分布、高斯分布、泊松分布等。 标签噪声的产生原因: (1)特定类别…

【GEMM预备工作】行主序和列主序矩阵的内存中的连续性,解决理解问题

在内存存储中&#xff0c;默认矩阵是按照行优先储存的&#xff0c;即矩阵的每一列在内存中是连续的。行优先矩阵储存中行数据是不连续的。 而对于列主序的矩阵&#xff0c;是按照列优先储存的&#xff0c;即矩阵的每一行在内存中是连续的。列优先矩阵储存中列数据是不连续的&am…

ReentrantLock锁并发环境线程安全读写ArrayList,Kotlin

ReentrantLock锁并发环境线程安全读写ArrayList&#xff0c;Kotlin import kotlinx.coroutines.* import java.util.concurrent.locks.ReentrantLock import kotlin.collections.ArrayList/*** 假设这样一种场景&#xff1a;在多线程的并发环境中&#xff0c;不同的线程/协程对…

python在函数中更改外部变量值

目录 前言 列表、字典&#xff08;可变对象&#xff09; 元组&#xff08;不可变对象&#xff09; 全局变量 前言 今天在写LeetCode题时&#xff0c;发现一个问题我并没有掌握&#xff0c;那就是如何在Python的函数中更改变量值&#xff08;包括列表&#xff0c;字典&…