《VC++深入详解–学习笔记》(13)文档与串行化

Filed Under (VC++ 学习笔记) by panmaoru on 17-12-2009

本章首先介绍了一种新的读写文件方式,使用MFC提供的CArchive类来实现。可以利用CArchive类将对象数据保存到永久设备上。这样即使应用程序关闭,再次启动后仍然可以从磁盘上读取对象数据,然后在内存中重构相应的对象。让数据持久性的过程成为串行化或序列化。

CArchive对象不仅可以处理基本类型的数据,还可以处理CObject类的派生对象。CArchive类重载了提取(>>)和插入(<<)操作符。通过这些重载的函数,可以利用CArchive对象完成对文件的读写操作。

CArchive构造函数的声明如下:

CArchive( CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL );

pFile:指向文件对象的指针,该文件对象是持久数据的来源或目的地;

nMode:文件对象的标示符(load,store)读取还是存储;

CArchive类写入数据的实例:

void CFileView::OnFileWrite()
{
       CFile file("7.txt",CFile::modeCreate|CFile::modeWrite);
       CArchive ar(&file,CArchive::store);
       int i=1;
       char ch='1';
       float f=1.3f;
       CString str="www.colsir.com";
       ar<<i<<ch<<f<<str;
}

完成写入操作之后,用记事本打开7.txt,发现基本上都是乱码。这是因为CArchive对象是一种二进制流。

CArchive类读取数据的实例:

void CFileView::OnFileRead()
{
       CFile file("7.txt",CFile::modeRead);
       CArchive ar(&file,CArchive::load);
       int i;
       char ch;
       float f;
       CString str;
       CString strResult;
       ar>>i>>ch>>f>>str;
       strResult.Format("%d,%c,%f,%s",i,ch,f,str);
       MessageBox(strResult);
}

对象读取的顺序必须和保存的顺序一致,有些搞不懂,那CArchive类还有什么优势?暂时理解不了。

MFC新建,保存文件时的格式过滤

在字符串表中一个ID为IDR_MAINFRAME的行,用来实现一些初始值的设置。该项的值的优先级低于OnNewDocument函数中的设置。通过查看OnNewDocument函数的申明,可以看到OnNewDocument函数是一个虚函数。

文档串行化

Serialize?看了半天没看懂什么意思。这两天心情有点浮躁,先平静下再补充。

Comments (1)

  1. 采用CArchive传输文件会出现文件类型无法识别,现用CFile

Post a comment