更新时间:2024-02-06 11:30
CArchive 对象提供了一个类型安全缓冲机制,用于将可序列化对象写入 CFile 对象或从中读取可序列化对象。通常,CFile 对象表示磁盘文件;但是,它也可以是表示“剪贴板”的内存文件(CSharedFile 对象)。
给定的 CArchive 对象要么存储数据(即写入数据或将数据序列化),要么加载数据(即读取数据或将数据反序列化),但决不能同时进行。CArchive 对象的寿命只限于将对象写入文件或从文件读取对象的一次传递。因此,需要两个连续创建的 CArchive 对象将数据序列化到文件,然后从文件反序列化数据。
当存档将对象存储到文件时,存档将 CRuntimeClass 名称附加到这些对象。然后,当另一个存档将对象从文件加载到内存时,将基于这些对象的 CRuntimeClass 动态地重新构造 CObject 派生的对象。通过存储存档将给定对象写入文件时,该对象可能被引用多次。然而,加载存档将仅对该对象重新构造一次。有关存档如何将 CRuntimeClass 信息附加到对象以及重新构造对象(考虑可能的多次引用)的详细信息。
将数据序列化到存档时,存档积累数据,直到其缓冲区被填满为止。然后,存档将其缓冲区写入 CArchive 对象指向的 CFile 对象。同样,当您从存档中读取数据时,存档会将数据从文件读取到它的缓冲区,然后从缓冲区读取到反序列化的对象。这种缓冲减少了物理读取硬盘的次数,从而提高了应用程序的性能。
CArchive使用缓冲区作为临时数据存储地,读写都先依次排列到此缓冲区,当缓冲区满或用户要求时,将此段整理后的数据读写到指定的存储介质。 好比火车货场装运零散的货物被收集,当总量到达火车运量的时候,由火车装运走。
CArchive允许以一个永久二进制(通常为磁盘存储)的形式保存一个对象的复杂网络,它可以在对象被删除时,还能永久保存。可以从永久存储中装载对象,在内存中重新构造它们。使得数据永久保留的过程就叫作“串行化”。
可以把一个归档对象看作一种二进制流。像输入/输出流一样,归档与文件有关并允许写缓冲区以及从硬盘读出或读入数据。输入/输出流处理一系列ASCII字符,但是归档文件以一种有效率、精练的格式处理二进制对象。
必须在创建一个CArchive对象之前,创建一个CFile对象。另外,必须确信归档文件的装入/存储与文件的打开模式是兼容的。每一个文件只限于一个活动归档文件。
当构造一个CArchive对象时,要把它附加给表示一个打开文件的类CFile(或派生类)的对象上。还要指定归档文件将用于装载还是存储。CArchive对象不仅可以处理首要类型,而且还能处理为串行化而设计的CObject_派生类的对象。一个串行化类通常有一个Serialize成员函数并且使用DECLARE_SERIAL和IMPLEMENT_SERIAL宏。这些在CObject类中有所描述。
重载提取(>>)和插入(<<)是方便的归档编程接口。它支持主要类型和CObject派生类。
CArchive还支持使用MFC Windows套接字类CSocket和CSocketFile编程。IsBufferEmpty成员函数也支持这种使用。如果要了解有关CArchive的更多信息,请参阅联机文档“Visual C++ 程序员指南”中的“串行化(永久对象)” 和“Windows套接字:在归档文件中使用套接字”
include
请参阅 CFile,CObject,CSocket,CSocketFile
数据成员
m_pDocument 指向被串行化的CDocument对象
CArchive 创建一个CArhcive对象
Abort在不异常的情况下,关闭归档文件
Close冲掉未写入数据并且释放与CFile的连接
基础输入/输出
Flush从归档文件缓冲区中冲掉未写入数据
运算符>>装载对象和归档文件的主要类型
运算符<<存储对象和归档文件的主要类型
Read读入原始类型
Write写入原始类型
WriteString写一行文本
ReadString读一行文本
状态
GetFile获得此归档文件的
CFile对象指针
GetObjectSchema由Serialize函数调用来确定被非串行化的对象的版本SetObjectSchema在归档文件中存储对象概要
IsLoading确定归档文件是否被装载
IsStoring确定归档文件是否被存储
IsBufferEmpty确定在一个Windows Socket接收过程中缓冲区是否被清空
对象输入/输出
ReadObject调用一个用于装载的Serialize函数
WriteOjbect调用一个用于装载的Serialize函数
MapObject在没有对文件串行化的映射中放置对象,但是此映射对参考的子对象有效
SetStoreParams设置哈希表的大小和映射的块的大小,在串行化的过程中识别唯一的对象
LoadParams设置装载数组扩展的大小。必须在被装载对象之前或调用MapObject或ReadObject之前
ReadClass读入一个原先存储在WriteClass中的类的参考
WriteClass把对CRuntime的参考写入CArchive
SerializeClass根据CArchive方向,读入或写入对CArchive对象的类的参考
成员函数
CArchive::Abort
void Abort( );
说明
调用此函数在不异常的情况下关闭归档文件。CArchive析构程序将调用Close,它将冲掉任何没有被存储在相关CFile对象中的数据。这会引起异常。
当获取这些异常时,有一个好的方法就是使用Abort,这样析构CArchive对象就不会再引起异常。当处理异常时,在失败时CArchive::Abort将不会异常,因为与CArchive::Clsoe不同,Abort忽略失败。
如果使用new在堆上分配CArchive对象,则在关闭文件之后,必须删除它。
请参阅
CArchive::Close,
CFile::Close
CArchive::CArchive
CArchive(CFile*pFile,UINTnMode,int nBufSize=4096,void*lpBuf=NULL );
throw(CmemoryException,CArchiveException,CFileException);
pFile
CFile对象的指针。CFile对象是永久数据的最终的源或目标。
nMode标识
它指定了对象是否从归档文件中装载或存储到文件中去。
nMode参数必须有下列值之一:
l CArchive::load 从归档文件装载数据。CFile只读。
l CArchive::store 把数据保存到归档文件中。允许CFile写操作。
l CArchive::bNoFlushOnDelete 当归档文件析构程序被调用时,防止归档文件自动调用Flush。如果设定了此标识,则在析构程序被调用之前必须负责调用Close函数。如果不这样做,数据就会崩溃。
nBufSize
指定内部文件缓冲区大小的整数,以字节计算。注意缺省的缓冲区大小为4096字节。如果例程归档大的对象,使用大一些的缓冲区,即多个文件缓冲区,那么将会提高例程的执行效率。
lpBuf
指向nBufSize大小的提供缓冲区的指针。如果不指定这个参数,归档文 件从本地堆为归档文件分配一个缓冲区并且当对象被毁弃时,释放缓冲 区。归档文件不能释放一个提供的缓冲区。
说明
构造CArchive对象并且指定它将用于装载或存储对象。在创建归档文件之后,不能改变这个指定内容。不能使用CFile操作来改变文件的状态直到已经关闭归档文件时。任何这样的操作都将会毁弃归档文件的完整性。通过由GetFile成员函数获得归档文件的文件对象使得可在串行化过程中的任何时候访问文件指针的位置。然后使用CFile::GetPosition函数。应该在获得文件指针位置之前,调用CArchive::Flush。
示例
extern char* pFileName
CFile f;
char buf[512];
if(!f.Open( pFileName,CFile::modeCreate| CFile::modeWrite)){
#ifdef_DEBUG
afxDump<< “unable to open file”<<” ”;
exit(1);
}
CArchive ar( &f, CAchive::strore,512,buf);
请参阅 CArchive::Close,
CArchive::Flush,
CFile::Close
CArchive::Close
void Close( )
throw( CArchiveException,CFileException);
说明
冲掉保存在缓冲区中的任何数据,关闭归档文件并且释放归档文件与文件的链接。对于归档文件没有允许的其它操作。在关闭一个归档文件之后,可以为一个同样文件创建另一个归档文件或者关闭文件。成员函数Close保证所有数据从归档文件传输到文件并且使归档文件无效。为了完成从文件到存储介质的传输,必须首先使用CFile::Close并且再毁弃CFile对象。
请参阅 CArchive::Flush,
CArchive::Abort
CArchive::Flush
void Flush( );
throw( CFileException);
说明
迫使保留在归档文件中的数据写入文件。成员函数Flush保证所有的数据从归档文件传输到文件。必须调用CFile::Close来完成从文件到存储介质的