4.3.2 使用CArchive类进行串行化
在MFC中,CArchive对象可以将数据序列化(按照顺序)写入与它相关联的文件中去。它提供类型安全的缓冲机制。下面将讲一下CArchive类常用的函数。
1.工作原理
CArchive类对象在初始化时,先指定一个缓冲区作为临时存储,再将需要保存的数据写到缓冲区中。当缓冲区被填满时,才将缓冲区中的内容写入它所指向的CFile文件对象中。
同样,当用户读取数据时,串行化对象将数据从文件读取到指定的缓冲区,再从缓冲区读取到与对象相关联的文件中。这样,使用缓冲区不但减少了对物理硬盘的操作次数,而且提高程序的运行速度。
2.串行化对象
一般,CArchive类使用构造函数创建指定的串行化对象,并且与CSocketFile对象相关联。原型如下:
- CArchive::CArchive(CFile *pfile, UINT nMode, int nBufsize, Void *lpBuf=
- NULL);
参数pfile指向一个需要进行串行化的对象指针。nMode是设置创建对象的标志。如果用户设置了此标志,则必须在对象销毁前调用Close()函数关闭文件。否则,文件中的数据将会被损坏。该参数的常用标志如表4.5所示。
表4.5 nMode的常用标志
|
常 用 标 志< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
标志所示意义 |
|
CArchive::load(store) |
从文件中读取(保存)数据 |
|
CArchive::bNoFlushOnDelete |
是为了防止CArchive对象在被
销毁时候自动调用Flush进行更新 |
参数nBufsize用于设置的缓冲区大小;lpBuf用于自定义缓冲区,默认情况下为NULL。例如:
- CSocket *m_clientsocket=new CSocket; //创建套接字
- CSocketFile *m_sockfile=new CSocketFile(&m_clientsocket);
- //创建与m_clientsocket关联的对象
- CArchive *m_archive=new CArchive(&m_sockfile,CArchive::load| CArchive::
- store,100,NULL);
在代码中,为创建的串行化对象m_archive设置一个大小为100的缓冲区。最后一个参数设为NULL,表明缓冲区由系统决定。
3.串行化操作
在CArchive类中,是使用函数ReadString()和WriteString()进行CSocketFile文件的读写操作。函数原型如下:
- UINT CArchive:: ReadString(CString str);
- void CArchive:: WriteString(CString str1);
这两个函数均包含一个字符串类型的参数。但是,其具体含义却不同,分别如下:
str表示将读取后保存的字符串数据。
str1表示将写入的字符串数据。
除了上面的方法以外,还可以使用串行化操作的基本方法。代码如下:
- ... //省略部分代码
- m_archive<<str; //向串行化对象m_archive写入字符串str
- m_archive>>str1; //从串行化对象m_archive读出数据到str1
- m_archive->Close(); //关闭串行化对象m_archive
在这里用户需要注意,在关闭串行化对象后,与其相关联的文件对象也会随之被关闭。函数CArchive::Close()用于清除CArchive类创建时所指定的缓冲区,再关闭CArchive对象,并且将CArchive对象和与之相关联的CSocketFile对象进行分离。
如果用户需要马上将数据写入到串行化对象中,需要用到Flush函数。它主要用于将缓冲区中剩余的数据强制地写入CArchive对象所关联的文件中。代码如下:
- ... //省略部分代码
- m_archive->WriteString(str+"\r\n");//调用CArchive
类的WriteString发送命令 - //在这里也可以使
用 m_archive<<str<<"\r\n"; - m_archive->Flush(); //强制将数据str写入到串行化对象中
- m_archive->Close(); //关闭串行化对象
在程序中,如果没有调用函数Flush(),那么真正将数据写入到物理磁盘是在调用函数Close()关闭串行化对象以后。因此,一些重要的数据需要使用Flush()函数立即写入文件,以防丢失。