一、前言
不好意思啊。最近事情有点多,不能及时更新博客,请见谅。接下来,我们直接进入正题——文档序列化。
二、什么是序列化
序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。
我们可以理解为,序列化就是保存,反序列化就是打开。
三、实现文档序列化的方法
(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;
}
}
好了,以上就是文档序列化的基本知识以及操作,大家还是得多多实践。
三、结语
哎,这篇博客拖了好久了,因为最近事情实在是有点多,忙不过来,我都有点想开摆了。但我还是得抽出时间来完成,保持每个星期一篇。好了就到这里吧,我还得去忙其他的事情了,拜拜!我们下次再见!