首先介绍CArchive这个类(翻译自MSDN):

CArchive类允许你以一种二进制的形式(通常是磁盘)来保存一个复杂的对象网络。当这些对象被delete掉之后这种二进制形式依然存在。

CArchive类没有基类。保存之后,你可以从磁盘中加载这些对象,在内存中重新构建他们,这种将数据持久化的过程成为序列化。

你可以将一个CArchive对象想象成一种二进制流。和输入输出流一样,一个CArchive对象与一个文件相关联,该文件允许缓冲的从存储介质中读数据,或缓冲的将数据写到存储介质中。输入\输出流处理一连串的ASCII字符,但是一个CArchive对象处理二进制流,且以一种非冗余以及更加有效的方式。

在创建一个CArchive对象之前必须先创建一个CFile对象。另外还必须确保CArchive对象的加载/保存状态与CFile的打开模式相兼容。一个CArchive对象被限制为只能与一个CFile相关联。

当你构造一个CArchive对象,与一个CFile或CFile的派生类相关联时,你还需指定CArchive对象是否被用来加载或是保存。一个CArchive对象不仅能处理原始的数据类型,还能处理从CObject派生出来的用于序列化的对象。一个可序列化的对象通常包含一个序列化函数,并且通常使用在CObject中声明的DECLARE_SERIAL和IMPLEMENT_SERIAL这两个宏。

重载的取出(>>)以及插入(<<)运算符编程接口,使得CArchive处理原始的数据以及CObject派生类更加地方便。

CArchive还支持与MFC到的Sockets类CSOcket以及CSocketFile进行编程。成员函数IsBufferEmpty支持这种功能。

以下介绍一个使用CArchive的具体例子:

 
  
  1. void CSerializeView::OnReadFile()  
  2. {  
  3.     CFile file(_T("1.slf"), CFile::modeRead);  
  4.     CArchive ar(&file, CArchive::load);  
  5.  
  6.     int i;  
  7.     TCHAR ch;  
  8.     float f;  
  9.     CString str;  
  10.     CString strResult;  
  11.  
  12.     ar>>i>>ch>>f>>str;  
  13.     strResult.Format(_T("%d, %c, %f, %s"), i, ch, f, str);  
  14.     MessageBox(strResult);  
  15. }  
  16.  
  17. void CSerializeView::OnWriteFile()  
  18. {  
  19.     CFile file(_T("1.slf"), CFile::modeCreate | CFile::modeWrite);  
  20.     CArchive ar(&file, CArchive::store);  
  21.     int i = 4;  
  22.     TCHAR ch = _T('a');  
  23.     float f = 1.3f;  
  24.     CString str(_T("da jia hao hello world!"));  
  25.     ar<<i<<ch<<f<<str;  

 .slf为自定义的文件类型,在OnReadFile函数中MessageBox的弹出信息如下: