设为首页 加入收藏

TOP

4.3.2 使用CArchive类进行串行化
2013-10-07 13:01:53 来源: 作者: 【 】 浏览:75
Tags:4.3.2 使用 CArchive 进行 串行

4.3.2  使用CArchive类进行串行化

MFC中,CArchive对象可以将数据序列化(按照顺序)写入与它相关联的文件中去。它提供类型安全的缓冲机制。下面将讲一下CArchive类常用的函数。

1.工作原理

CArchive类对象在初始化时,先指定一个缓冲区作为临时存储,再将需要保存的数据写到缓冲区中。当缓冲区被填满时,才将缓冲区中的内容写入它所指向的CFile文件对象中。

同样,当用户读取数据时,串行化对象将数据从文件读取到指定的缓冲区,再从缓冲区读取到与对象相关联的文件中。这样,使用缓冲区不但减少了对物理硬盘的操作次数,而且提高程序的运行速度。

2.串行化对象

一般,CArchive类使用构造函数创建指定的串行化对象,并且与CSocketFile对象相关联。原型如下:

  1. CArchive::CArchive(CFile *pfile, UINT nMode, int nBufsize, Void *lpBuf=  
  2. 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。例如:

  1. CSocket  *m_clientsocket=new CSocket;                   //创建套接字  
  2. CSocketFile *m_sockfile=new CSocketFile(&m_clientsocket);  
  3.                                         //创建与m_clientsocket关联的对象  
  4. CArchive *m_archive=new CArchive(&m_sockfile,CArchive::load| CArchive::   
  5. store,100,NULL); 

在代码中,为创建的串行化对象m_archive设置一个大小为100的缓冲区。最后一个参数设为NULL,表明缓冲区由系统决定。

3.串行化操作

在CArchive类中,是使用函数ReadString()和WriteString()进行CSocketFile文件的读写操作。函数原型如下:

  1. UINT CArchive:: ReadString(CString str);   
  2.         void CArchive:: WriteString(CString str1); 

这两个函数均包含一个字符串类型的参数。但是,其具体含义却不同,分别如下:

str表示将读取后保存的字符串数据。

str1表示将写入的字符串数据。

除了上面的方法以外,还可以使用串行化操作的基本方法。代码如下:

  1. ...                             //省略部分代码  
  2. m_archive<<str;                 //向串行化对象m_archive写入字符串str  
  3. m_archive>>str1;                //从串行化对象m_archive读出数据到str1  
  4. m_archive->Close();             //关闭串行化对象m_archive 

在这里用户需要注意,在关闭串行化对象后,与其相关联的文件对象也会随之被关闭。函数CArchive::Close()用于清除CArchive类创建时所指定的缓冲区,再关闭CArchive对象,并且将CArchive对象和与之相关联的CSocketFile对象进行分离。

如果用户需要马上将数据写入到串行化对象中,需要用到Flush函数。它主要用于将缓冲区中剩余的数据强制地写入CArchive对象所关联的文件中。代码如下:

  1. ...                             //省略部分代码  
  2. m_archive->WriteString(str+"\r\n");//调用CArchive
    类的WriteString发送命令  
  3.                                 //在这里也可以使
    用  m_archive
    <<str<<"\r\n";  
  4. m_archive->Flush();             //强制将数据str写入到串行化对象中  
  5. m_archive->Close();             //关闭串行化对象 

在程序中,如果没有调用函数Flush(),那么真正将数据写入到物理磁盘是在调用函数Close()关闭串行化对象以后。因此,一些重要的数据需要使用Flush()函数立即写入文件,以防丢失。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.3.3 获取FTP服务器文件信息 下一篇4.4.3 使用CFtp类编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: