MrRIGHT CArchive类的用法.docx
《MrRIGHT CArchive类的用法.docx》由会员分享,可在线阅读,更多相关《MrRIGHT CArchive类的用法.docx(20页珍藏版)》请在冰豆网上搜索。
MrRIGHTCArchive类的用法
CArchive类的用法
2011-04-2306:
55:
17| 分类:
默认分类| 标签:
c++ |字号大中小 订阅
CArchive类的成员
数据成员
m_pDocument指向被串行化的CDocument对象
构造函数
Carchive创建一个Carhcive对象
Abort在不异常的情况下,关闭归档文件
Close冲掉未写入数据并且释放与CFile的连接
基础输入/输出
Flush从归档文件缓冲区中冲掉未写入数据
运算符>>装载对象和归档文件的主要类型
运算符<<存储对象和归档文件的主要类型
Read读入原始类型
Write写入原始类型
WriteString写一行文本
ReadString读一行文本
状态
GetFile获得此归档文件的
CFile对象指针
GetObjectSchema由Serialize函数调用来确定被非串行化的对象的版本SetObjectSchema在归档文件中存储对象概要
IsLoading确定归档文件是否被装载
IsStoring确定归档文件是否被存储
IsBufferEmpty确定在一个WindowsSocket接收过程中缓冲区是否被清空
对象输入/输出
ReadObject调用一个用于装载的Serialize函数
WriteObect调用一个用于装载的Serialize函数
MapObject在没有对文件串行化的映射中放置对象,但是此映射对参考的子对象有效
SetStoreParams设置哈希表的大小和映射的块的大小,在串行化的过程中识别唯一的对象
LoadParams设置装载数组扩展的大小。
必须在被装载对象之前或调用MapObject或ReadObject之前
ReadClass读入一个原先存储在WriteClass中的类的参考
WriteClass把对CRuntime的参考写入Carchive
SerializeClass根据CArchive方向,读入或写入对CArchive对象的类的参考
成员函数
CArchive:
:
Abort
voidAbort();
说明
调用此函数在不异常的情况下关闭归档文件。
CArchive析构程序将调用Close,它将冲掉任何没有被存储在相关CFile对象中的数据。
这会引起异常。
当获取这些异常时,有一个好的方法就是使用Abort,这样析构CArchive
对象就不会再引起异常。
当处理异常时,在失败时CArchive:
:
Abort将不会异常,因为与CArchive:
:
Clsoe不同,Abort忽略失败。
如果使用new在堆上分配CArchive对象,则在关闭文件之后,必须删除它。
请参阅
CArchive:
:
Close,
Cfile:
:
Close
CArchive:
:
CArchive
CArchive(CFile*pFile,UINTnMode,intnBufSize=4096,void*lpBuf=NULL);
throw(CmemoryException,CArchiveException,CFileException);
参数
pFileCFile
对象的指针。
CFile对象是永久数据的最终的源或目标。
nMode标识。
它指定了对象是否从归档文件中装载或存储到文件中去。
nMode参数必须有下列值之一:
lCArchive:
:
load 从归档文件装载数据。
CFile只读。
lCArchive:
:
store 把数据保存到归档文件中。
允许CFile写操作。
lCArchive:
:
bNoFlushOnDelete 当归档文件析构程序被调用时,防止归档文件自动调用Flush。
如果设定了此标识,则在析构程序被调用之前必须负责调用Close。
如果不这样做,数据就会崩溃。
nBufSize
指定内部文件缓冲区大小的整数,以字节计算。
注意缺省的缓冲区
大小为4096字节。
如果例程归档大的对象,使用大一些的缓冲区,即多个文件缓冲区,那么将会提高例程的执行效率。
lpBuf
指向nBufSize大小的提供缓冲区的指针。
如果不指定这个参数,归档文件从本地堆为归档文件分配一个缓冲区并且当对象被毁弃时,释放缓冲区。
归档文件不能释放一个提供的缓冲区。
说明
构造CArchive对象并且指定它将用于装载或存储对象。
在创建归档文件之后,不能改变这个指定内容。
不能使用CFile操作来改变文件的状态直到已经关闭归档文件时。
任何这样的操作都将会毁弃归档文件的完整性。
通过由GetFile成员函数获得归档文件的文件对象使得可在串行化过程中的任何时候访问文件指针的位置。
然后使用Cfile:
:
GetPosition函数。
应该在获得文件指针位置之前,调用CArchive:
:
Flush。
示例
externchar*pFileName
CFilef;
charbuf[512];
if(!
f.Open(pFileName,Cfile:
:
modeCreate|Cfile:
:
modeWrite)){
#ifdef_DEBUG
afxDump<<“unabletoopenfile”<<”\n”;
exit
(1);
#endif
}
CArchivear(&f,Cachive:
:
strore,512,buf);
请参阅 CArchive:
:
Close,
CArchive:
:
Flush,
Cfile:
:
Close
CArchive:
:
Close
voidClose()
throw(CArchiveException,CFileException);
说明
冲掉保存在缓冲区中的任何数据,关闭归档文件并且释放归档文件与文件的链接。
对于归档文件没有允许的其它操作。
在关闭一个归档文件之后,可以为一个同样文件创建另一个归档文件或者关闭文件。
成员函数Close保证所有数据从归档文件传输到文件并且使归档文件无效。
为了完成从文件到存储介质的传输,必须首先使用Cfile:
:
Close并且再毁弃CFile对象。
请参阅 CArchive:
:
Flush,
CArchive:
:
Abort
CArchive:
:
Flush
voidFlush();
throw(CFileException);
说明
迫使保留在归档文件中的数据写入文件。
成员函数Flush保证所有的数据从归档文件传输到文件。
必须调用Cfile:
:
Close来完成从文件到存储介质的传输。
请参阅 CArchive:
:
Close,
Cfile:
:
Flush,Cfile:
:
Close
CArchive:
:
GetFile
CFile*GetFile()const
返回值
指向正在使用的CFile对象的指针。
说明
为此归档文件获得CFile对象指针。
必须在使用GetFile之前冲掉归档文件。
示例
externCArchivear;
constCFile*fp=ar.GetFile();
请参阅
CArchive:
:
Flush
CArchive:
:
GetObjectSchemaUINT
GetObjectSchema()
返回值
返回在非串行化过程中,被读入对象的版本。
说明
由Serialize函数调用此函数,确定当前被非串行化的对象的版本。
当CArchive对象正在被装载时,调用此函数才是有效的(CArchive:
:
IsLoading则返回非零值)。
它必须是Serialize函数的第一次调用而且只能调用一次。
返回值-1(UINT)说明版本数未知。
CObject派生类可以使用与大纲版本自己(在IMPLEMENT_SERIALH宏里)结合起来使用的VERSIONABLE_SEHEMA,创建一个“版本化对象”,即一个对象它的成员函数可以读入多个版本。
当版本不匹配时,缺省的框架功能(不带有VERSIONABLE_SHEMA)将异常信号。
示例
IMPLEMENT_SERIAL(CMyObject,CObject,VERSIOANABLE_SCHEMA|1)
voidCMyObject:
:
Serialize(CArchive&ar)
{
if(ar.Isloading())
{
intnVersion=ar.GetObjectSchma();
switch(nVersion)
{
case0:
//readinpreviousversionof /
/thisobject
break;
case1:
//readincurrentversionof
//thisobject
break;
default:
//reportunknownversionof
//thisobject
break;
}
}
else
{
//Normalsoringcodegoeshere
}
}
请参阅 CObject:
:
Serialize,
CObject:
:
IsSerializable,
IMPLEMNET_SERIAL,DECLARE_SERIAL,
CArchive:
:
IsLoading
CArchive:
:
IsBufferEmpty
BOOLIsBufferEmpty()const
返回值
如果归档文件的缓冲为空,则返回非零值,否则为0。
说明
调用此函数,确定归档文件的缓冲区是否为空。
此函数支持使用Windows套接字类CSocketFile编程。
对与CFile对象有关的归档文件则不需要使用它。
与CSocketFile对象相关的归档文件使用IsBufferEmpty的原因是归档文件的缓冲区可能包含多个消息或记录。
在接收一个消息时,应该使用IsBufferEmpty控制这样一个循环,它不断地接收数据,直到缓冲区为空。
如果要了解更多的内容,请参阅类CAsyncSocket的Rceive成员函数以及MFC高级概念样例CHATSRVR,它将告诉你如何使用IsBufferEmpty。
如果要了解更多的内容,请参阅联机文档“VisualC++程序员指南”中的“Windows套接字:
在归档文件中使用套接字”。
请参阅 CSocketFile,
CAsyncSocket:
:
Receive
CArchive:
:
IsLoading
BOOLIsLoading()const
返回值
如果正在装载归档文件,则返回非零值,否则为0。
说明
确定归档文件是否正在装载数据。
此成员函数由归档文件类的Serialize函数调用。
示例
inti;
externCArchivear;
if(ar.Isloading())
ar>>i;else
ar<
请参阅 CArchive:
:
IsStoring
CArchive:
:
IsStoring
BOOLIsStorng()const;
返回值
如果正在存储归档文件,则返回非零值,否则为0。
说明
确定是否正在存储归档文件。
这个函数由归档文件类的Serialize函数调用。
如果归档文件的IsStoring状态为非零,则它的IsLoading状态为0,反
之亦然。
示例
inti;
externCArchivear;
if(ar.IsStoring())
ar<>i;
请参阅 CArchive:
:
IsLoading
CArchive:
:
MapObject
voidMapObject(constCObject*pOb);
参数
pOb指向正在存储的对象的指针。
说明
调用此成员函数在映射中放置对象。
此映射没有真的对文件串行化,但是对参考的子对象有效。
举例来说,可能不想串行化一个文档,但是想对作为文档一部分的项串行化。
通过调用MapObject,可允许那些项或子对象参考文档。
而且,串行化子项还可以串行化它们的m_pDocument向后的指针。
当要把数据存储到CArchive对象和从它装载数据时,可以调用MapObject。
在串行化和非串行化的过程中,MapObject向由CArchive保持的内部数据结构添加特定的对象,但是它不象ReadObject和WriteObject那样,它不会对对象串行化。
示例
//MyDoc.h
//DocumentshouldhaveDECLEAR_SERIALandIMPLEMENT_SERIAL
classCMyDocument:
publicCDocument
{
CObListm_listOfSubItems;
……
DECLARE_SERIAL(CMyDocument)
};
//MyDoc.cpp
…….
MPLEMENT_SERIAL(CMyDocument.CObject,1)
…….
voidCMyDocument:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
//TODO:
addstoringcodehere
}
else
{
//TODO:
addloadingcodehere
}
ar.MapObject(this);
//serializethesubitemsinthedocuments;
//theywillbeabletoserializetheirm_pDoc
//back
pointer m_listOfSubItems.Serialize(ar);
}
//SubItem.hclass
CSubItem:
publicCObject
{
public CSubItem(CMYDocument*Pdoc)
{m_pDoc=pDoc}
//backpointertoowningdocument
CMYDocument*m_pDoc
WORDm_I;
//otheritemdata
virtualvoidSerialize(CArchive&ar);
};
//SubItem.cpp
voidCSubItem:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{ //willserializingareference
//tothe“mapped”documentpointer
ar<ar<}
else
{
//willloadareferenceto
//thethe“mapped”documentpointer
ar>>m_pDoc;
ar>>m_i;
}
}
请参阅 CArchive:
:
ReadObject,CArchive:
:
WriteObject
CArchive:
:
Read
UINTRead(void*lpBuf,UINTnMax);
throw(CFileException);
返回值
包含实际读入字节数的无符号整数。
如果返回值小于所需要的数值,则说明已达到了文件的末尾。
达到文件末尾时,没有异常。
参数
lpBuf指向提供的缓冲区的指针。
这个提供的缓冲区接收从归档文件读取的数据。
nMax标明从归档文件读取的字节数的无符号指针。
说明
从归档文件读取指定的字节数。
归档文件不解释字节数。
可以在Serialize函数里使用Read成员函数,读取包含在对象中的普通结构。
示例
externCArchivear;
charpb[100];
UINTnr=ar.Read(pb.100);
CArchive:
:
ReadClass
CRuntimeClass*ReadClass(const
RuntimeClass*pClassRefRequested=NULL,
UINT*pSchema=NULL,DWORD*obTag=NULL);
throwCArchiveException;
throwCNotSupportedException;
返回值
指向CRuntimeClass结构的指针。
参数
pClassRefRequested
指向CRuntimeClass结构的指针,此结构对应于所需要的类的参考。
可以为NULL。
pSchema
指向原先存储的运行时类的大纲的指针。
obTag
代表对象的唯一标识的数值。
通过ReadObject的实现,在内部使用。
只用于高级编程。
obTag通常应为NULL。
说明
调用此成员函数来读取一个原先存储在WriteClass中的类的参考。
如果pClassRefReguested不为NULL,ReadClass证明了归档文件类信息与例程类是兼容的。
如果不兼容,ReadClass将产生一个CArchiveException。
例程必须使用DECLARE_SERIAL和IMPLEMENT_SERIAL,否则,ReadClass将产生一个CNotSupportedException。
如果pSchema为NULL,则存储类的大纲可通过调用CArchive:
:
GetObjectSchema来恢复,否则,*pSchema将会包含原先存储的运行时类的大纲。
可以使用SerializeClass来代替ReadClass,它可以处理类参考的读和写。
请参阅 CArchive:
:
WriteClass,
CArchive:
:
GetObjectSchema,
CArchive:
:
SetObjectSchema,
CArchiveExcepti_on,
CNotSupportedException,
CArchive:
:
SerializeClass
CArchive:
:
ReadObject
CObject*ReadObject(constCRuntimeClass*pClass); throw(CFileException,CArchiveException,CMemoryException);
返回值
CObject指针。
它必须通过使用CObject:
:
IsKindOf安全地指向当前的派生类。
参数
pClass
指向CRumtimeClass结构的常量指针。
此结构对应于期待读入的对象。
说明
从归档文件中读入对象并构造一个合适类型的对象。
此函数通常由CArchive提取(>>)运算符重载一个CObject指针调用它。
ReadObject,反过来,调用归档文件类的Serlialize函数。
如果提供一个非零的pClass参数,它可以从RUNTIME_CLASS获得,则函数确认归档文件的运行类。
假设在类的实现中已经使用IMPLEMENT_SERIAL宏。
请参阅 CArchive:
:
WriteObject,
CObject:
:
IsKindOf
CArchive:
:
ReadStringBool
ReadString(CString&rString);
LPTSTRReadString(LPTSTRlpsz,UINTnMax);
throw(CArchiveException);
返回值
在返回逻辑值的版本中,True代表成功;False相反。
在返回LPTSTR的版本中,LPTSTR是一个指向包含文字数据的缓冲区的指针,NULL代表到达文件尾。
参数
rString
CString的一个参考。
CString将包含从与CArchive对象有关的文件中读出的结果字符串。
Lpsz
指定一个指向提供的缓冲区的指针。
此缓冲区将接收一个以空终止符结尾的文字串。
nMax
指定读入字符的最大数。
它不允许小于lpsz缓冲区的大小。
说明
调用此函数从与CArchive对象有关的文件中读取数据,放入缓冲区。
在带有nMax参数的成员函数的版本中,缓冲区最多有nMax-1字符。
读入的操作由一个回车换行符终止。
在新行符号后面的字符都被丢弃了。
在每种情况下,都有一个空字符(“/0”)。
CArchive:
:
Read还对文本-模式输入有效,但是它不以回车换行符终止。
请参阅 CArchive:
:
Read,
CArchive:
:
WriteString,
CArchiveException
CArchive:
:
SerializeClass
voidSerializeClass(constCRuntimeClass*pRuntimeClass);
参数
pRuntimeClass
指向基类的运行类对象的指针。
说明
当想存储和装载一个基类的版本信息时,调用此成员函数。
SerializeClass读或对CArchive对象写一个类的参考,取决于CArchive的方向。
使用SerializeClass来代替ReadClass和WriteClass,可以使得更方便地串行化基类对象。
因为SerializeClass需要较少的代码和参数。
像ReadClass一样,SerializeClass证明了归档文件信息与的例程类兼容。
如果不兼容,则SerializeClass将一个CArchiveException。
运行类必须使用DECLARE_SERIAL和IMPLEMENT_SERIAL,否则,SerializeClass将会一个CNotSupportException。
使用RUMTIME_CLASS宏,恢复pRuntimeClass参数的值。
基类必须已经使用IMPLEMENT_SERIAL宏。
示例
classCBaseClass:
publicCObject{…};
classCDerivedClass:
publicCBaseClass{…};
voidCDerivedClass:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
//normalcodeforstoringcontents
//ofthisobject
}
else
{
//normalcodeforreadingcontents
//ofthis