文档序列化

本文档介绍了MFC中实现文档序列化的两种方法:利用CFile进行文件操作和使用CArchive进行对象的序列化与反序列化。通过实例详细解析了CFile类的Open函数参数及文件操作流程,以及CArchive如何配合CObject派生类进行数据的存档和加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

不好意思啊。最近事情有点多,不能及时更新博客,请见谅。接下来,我们直接进入正题——文档序列化
在这里插入图片描述


二、什么是序列化

序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。

我们可以理解为,序列化就是保存,反序列化就是打开


三、实现文档序列化的方法

(1)、类CFile

MFC提供了类CFile方便文件的读/写,类CFile提供了一些常用的文件操作函数,如图:
在这里插入图片描述
使用类CFile操作文件的流程,第一,构造一个CFile对象。第二,创建、打开指定的文件。第三,进行文件读/写操作。第四,关闭文件句柄

文件打开的方式有很多:
在这里插入图片描述
接下来我们来尝试创建一个文件:

CFile file;
	file.Open((LPCTSTR)"D:\\123.txt", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite, NULL);
	file.Write("HolleWorld", strlen("HolleWorld"));//第一个参数为要写入文件里的内容,第二个参数为写入文件里的内容的长度
	file.Close();

我们先来了解一下关于Open()函数的参数:

virtual BOOL Open(
    LPCTSTR lpszFileName,//此处为文件名路径D:\\123.txt就是在D盘下创建文件名123的文件,txt为文件类型,需要注意的是,此参数必须是LPCTSTR,所以可能有时需要进行强制转换
    UINT nOpenFlags,//指定打开文件时要执行的操作,也就是打开方式
    CFileException* pError = NULL);//指向将接收失败操作状态的现有文件异常对象的指针

嘿嘿嘿,当你运行代码的时候是不是报错了呀。
在这里插入图片描述
不着急,我来一步一步教你解决。首先我们打开属性管理器,然后在右键项目,点击属性。
在这里插入图片描述
打开之后依次点击配置属性->C/C++->代码生成,然后将运行库的选项改为多线程(/MT)或者多线程调试(/MTd)最后点击确认,重新运行代码就OK了
在这里插入图片描述
运行程序之后,我们去D盘里找一找,看看有没有创建名为123的txt文件。
在这里插入图片描述
我们发现成功创建了文件名为123的txt文件。

(2)、类CArchive和序列化函数

类CArchive 提供 << 和 >> 运算符,用于写入CObject读取简单数据类型,以及从文件写入和读取的

1.通过存档将对象存储在文件中

CArchive ar(&theFile, CArchive::store);
WORD wEmployeeID = 78;
ar << wEmployeeID;

2.从以前存储在文件中的值加载对象

CArchive ar(&theFile, CArchive::load);
WORD wEmployeeID;
ar >> wEmployeeID;

通常,在 SerializeCObject派生类的函数中,通过存档在文件中存储和加载数据,这些函数必须使用 DECLARE_SERIALIZE 宏声明。 对对象的引用 CArchive 将传递给函数 Serialize()。调用对象的 IsLoading函数 CArchive ,以确定是否已 Serialize()调用函数以从文件加载数据或将数据存储到文件。可 Serialize 序列化 CObject派生类的函数通常具有以下形式:

void CSerializableObj::Serialize(CArchive &archive)
{
   if (archive.IsStoring())
   {
      // TODO: 在此添加存储代码
   }
   else
   {
      // TODO: 在此添加加载代码   
   }
}

此代码模板有助于编写更易于查看的代码,因为存储代码和加载代码应始终并行,如以下示例所示:

void CEmployee::Serialize(CArchive &archive)
{
   if (archive.IsStoring())
   {
      archive << m_strName << m_wAge;
   }
   else
   {
      archive >> m_strName >> m_wAge;
   }
}

好了,以上就是文档序列化的基本知识以及操作,大家还是得多多实践


三、结语

哎,这篇博客拖了好久了,因为最近事情实在是有点多,忙不过来,我都有点想开摆了但我还是得抽出时间来完成,保持每个星期一篇。好了就到这里吧,我还得去忙其他的事情了,拜拜!我们下次再见!

在这里插入图片描述


评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yan.阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值