认识CArchive类

序列化


当我们创建对象的时候,对象就存在于内存中,当其生命周期结束后,这些被创建的对象就要被销毁;当对象被销毁后,我们就无法知道这些对象的值。MFC提供了CArchive类可以将对象数据保存到永久设备,比如磁盘文件。当应用程序重新启动后,CArchive类可以帮助我们从磁盘文件读取这些数据,然后在内存中重新构建对应的对象;这样就使得我们的对象数据永久存在,该过程称之为序列化(或者串行化)。


CArchive类


CArchive类没有基类,一个CArchive对象以一种有效的、非冗余的格式处理二进制对象数据;当构造一个CArchive对象后,就可以将它与一个打开的CFile类或者派生类对象相关联,并且一个CFile对象只能和一个活动的归档对象相关联在创建CArchive对象之前,必须先创建一个CFile类或者其派生类对象;同时我们需要确保这个CFile对象的打开方式和该归档对象(CArchive)的加载/保存状态保存一致。

CArchive类对象可以处理基本的数据类型,比如int,float,CString等,还可以处理CObject类的派生类;CArchive类重载了提取(>>)和插入(<<)操作符,这两个操作符可以支持基本类型,也可支持CObject的派生类;提取(>>)操作符是从文件中加载CObject类对象和基本数据类型,插入(<<)操作符是从文件中读取CObject类对象和基本数据类型。

CArchive类的构造函数如下:

CArchive(CFile* pFile,UINT nMode,int nBufSize=4096,void* lpBuf=NULL );

参数: 
pFile   
    CFile对象的指针。CFile对象是永久数据的最终的源或目标。  
nMode   
    它指定了对象是否从归档文件中装载或存储到文件中去。
nMode参数必须有下列值之一: 
· CArchive::load 从归档文件装载数据。CFile只读。  
· CArchive::store 把数据保存到归档文件中。允许CFile写操作。  
· CArchive::bNoFlushOnDelete 当归档文件析构程序被调用时,防止归档文件自动调用Flush。如果设定了此标识,则在析构程序被调用之前必须负责调用Close。如果不这样做,数据就会崩溃。  
 
nBufSize 

      指定内部文件缓冲区大小的整数,以字节计算。注意缺省的缓冲区大小为4096字节。如果例程归档大的对象,使用大一些的缓冲区,即多个文件缓冲区,那么将会提高例程的执行效率。  
lpBuf 

      指向nBufSize大小的提供缓冲区的指针。如果不指定这个参数,归档文件从本地堆为归档文件分配一个缓冲区并且当对象被毁弃时,释放缓冲区。归档文件不能释放一个提供的缓冲区。 


实例


我们创建一个Serialize的单文档工程,并在菜单栏上创建两个菜单项,一个是读文件,一个是写文件,在利用归档对象读写数据的时候,需要保证读写的对象顺序一致,它们的消息响应函数如下;

//自定义的CFile派生类对象,方便观察结果

class CUseFile:public CFile
{
public:
    //派生类才支持二进制读写
    CUseFile(LPCSTR strFileName,UINT nMode):CFile(strFileName,nMode){};
};

//加载对象数据

void CSerializeView::OnRead()
{
    // TODO: 在此添加命令处理程序代码

    CUseFile File("test.txt",CFile::modeRead|CFile::typeBinary);
    CArchive ar(&File, CArchive::load);
    int nStudentID = 0;
    CString strName= "";
    float fAverageScore = 0.0f;

    //读取对象的数据,需要和写入的顺序一致
    ar >> nStudentID >> strName >> fAverageScore;
    
    //显示读取的内容
    CString strLoadInfo;
    strLoadInfo.Format("ID = %d, Name = %s, Score = %.2f",nStudentID, strName, fAverageScore);
    MessageBox(strLoadInfo);
}

 

//保存对象数据

void CSerializeView::OnWrite()
{
    // TODO: 在此添加命令处理程序代码
    CFile File("test.txt", CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    CArchive ar(&File, CArchive::store);
    
    //将要保存的数据
    int nStudentID = 16;
    CString strName= "Mike";
    float fAverageScore = 90.1f;
    
    //保存数据到归档对象
    ar << nStudentID << strName << fAverageScore;
}


运行结果:



UltraEdit工具打开,可以观察到我们保存的数据。



序列化使得我们的数据得以保存和读取,具有了数据库保存数据的功能,因此对于记录少量的数据我们就可采用MFC的的序列化进行数据的存储和读取。


附录


CArchive类的成员

数据成员

m_pDocument指向被串行化的CDocument对象

构造函数
CArchive创建一个CArhcive对象
Abort在不异常的情况下,关闭归档文件
Close冲掉未写入数据并且释放与CFile的连接

基础输入/输出
Flush从归档文件缓冲区中冲掉未写入数据
operator >>装载对象和归档文件的主要类型
operator <<存储对象和归档文件的主要类型
Read读入原始类型
Write写入原始类型
WriteString写一行文本
ReadString读一行文本

状态
GetFile获得此归档文件的CFile对象指针
GetObjectSchema由Serialize函数调用来确定被非串行化的对象的版本
SetObjectSchema在归档文件中存储对象概要
IsLoading确定归档文件是否被装载
IsStoring确定归档文件是否被存储
IsBufferEmpty确定在一个Windows Socket接收过程中缓冲区是否被清空

对象输入/输出
ReadObject调用一个用于装载的Serialize函数
WriteObect调用一个用于装载的Serialize函数
MapObject在没有对文件串行化的映射中放置对象,但是此映射对参考的子对象有效
SetStoreParams设置哈希表的大小和映射的块的大小,在串行化的过程中识别唯一的对象
LoadParams设置装载数组扩展的大小。必须在被装载对象之前或调用MapObject或ReadObject之前
ReadClass读入一个原先存储在WriteClass中的类的参考
WriteClass把对CRuntime的参考写入CArchive
SerializeClass根据CArchive方向,读入或写入对CArchive对象的类的参考 


  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Carchive 是一个MFC,用于在计算机程序中对数据进行归档、存储和检索。它提供了对序列化对象和数据进行管理的功能。 Carchive 可以将对象和数据序列化文件或内存缓冲区,并可以根据需要进行反序列化以恢复对象和数据。它支持多种存储格式,如二进制、文本和XML。使用Carchive,可以轻松地将复杂的对象层次结构保存到文件中,并在需要时进行检索和重新加载。 Carchive 提供了一组成员函数,用于操作数据的序列化和反序列化。它们包括 Serialize、Read、Write 和 GetFileCarchive 似于一个桥梁,将程序中的数据和对象与存储设备连接起来。它提供了在存储设备上读取和写入数据的方法,使得程序能够从存储设备中加载数据,并将数据保存到存储设备中。 与Carchive相对应的是Csocket,它是一个用于网络编程的MFC。Csocket 提供了与网络通信相关的功能,例如创建套接字、连接到远程主机、接收和发送数据等。 使用Csocket,可以轻松地实现客户端和服务器之间的通信。它支持多种通信协议,如TCP和UDP。通过Csocket,程序可以与远程主机建立连接,并在连接上进行数据传输。 Csocket 提供了一组成员函数,用于初始化套接字、连接远程主机、发送和接收数据等操作。它还提供了一些事件和回调函数,以便程序能够处理与网络通信相关的事件。 总之,Carchive 和 Csocket 是MFC提供的两个有用的Carchive 可以帮助程序对数据进行归档和检索,而Csocket 则提供了与网络通信相关的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值