首先介绍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的具体例子:
- void CSerializeView::OnReadFile()
- {
- CFile file(_T("1.slf"), CFile::modeRead);
- CArchive ar(&file, CArchive::load);
- int i;
- TCHAR ch;
- float f;
- CString str;
- CString strResult;
- ar>>i>>ch>>f>>str;
- strResult.Format(_T("%d, %c, %f, %s"), i, ch, f, str);
- MessageBox(strResult);
- }
- void CSerializeView::OnWriteFile()
- {
- CFile file(_T("1.slf"), CFile::modeCreate | CFile::modeWrite);
- CArchive ar(&file, CArchive::store);
- int i = 4;
- TCHAR ch = _T('a');
- float f = 1.3f;
- CString str(_T("da jia hao hello world!"));
- ar<<i<<ch<<f<<str;
- }
.slf为自定义的文件类型,在OnReadFile函数中MessageBox的弹出信息如下:
转载于:https://blog.51cto.com/qsjming/558531