使用CArchive类进行序列化

来源:互联网 发布:越南陆军实力 知乎 编辑:程序博客网 时间:2024/05/17 22:27

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

(1) 工作原理

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

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

(2) 串行化对象

在通常情况下,CArchive类使用构造函数创建指定的串行化对象,并且与CSocketFile对象相关联。其语法格式如下:
CArchive::CArchive(CFile *pfile, UINT nMode,
int nBufsize, void *lpBuf=NULL);

参数pfile指向一个需要进行串行化的对象指针。nMode是设置创建对象的标志。如果用户设置了此标志,则必须在对象销毁前调用Close()函数关闭文件。否则,文件中的数据将会被损坏。该参数的常用标志如表3-6所示。

表3-6  nMode的常用标志

 

常用标志标志所表示的意义CArchive::load(store)从文件中读取(保存)数据
 参数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()函数将一些重要的数据立即写入文件。

0 0
原创粉丝点击