CArchive源码分析

本文详细剖析了MFC中的CArchive类,重点探讨了其在对象序列化过程中的作用和实现原理。通过对CArchive的源码分析,揭示了数据存档和读取的内部工作机制,包括如何进行字节流操作、对象的序列化与反序列化等关键步骤,旨在帮助开发者更好地理解和应用MFC的序列化功能。
摘要由CSDN通过智能技术生成
CArchive的功能:
1.CArchive封装了文件的读写操作,使文件读写变的更简单,其内部重载了<<  >> 使读写文件如使用cin cout一样
2.CArchive提供了缓存机制,使文件操作更高效
3.CArchive不仅只是封装文件操作,他还能够结合CMemFile  和 CSocketFile(这些都是CFile的派生类),使对其操作也更简化
先看下对DWORD写操作代码:
_AFX_INLINE CArchive& CArchive::operator<<(DWORD dw)
{ 
	if(!IsStoring())
		AfxThrowArchiveException(CArchiveException::readOnly,m_strFileName);
	if (m_lpBufCur + sizeof(DWORD) > m_lpBufMax)
		 Flush();	//Flush调用执行的条件是缓存满了,或是第一次执行读操作,第一次读时m_lpBufCur==m_lpBufMx,参见CArchive的构造函数
		*(UNALIGNED DWORD*)m_lpBufCur = dw;    //直接将dw填充到缓存中,m_lpBufCur 是指向缓存中当前写入的地址
		 m_lpBufCur += sizeof(DWORD);         //将当前指针后移四个字节
		 return *this;                       //返回CArchive对象本身,以便后续的<<操作
}
void CArchive::Flush()
{
	ASSERT_VALID(m_pFile);
	ASSERT(m_bDirectBuffer || m_lpBufStart != NULL);
	ASSERT(m_bDirectBuffer || m_lpBufCur != NULL);
	ASSERT(m_lpBufStart == NULL ||
		AfxIsValidAddress(m_lpBufStart, UINT(m_lpBufMax - m_lpBufStart), IsStoring()));
	ASSERT(m_lpBufCur == NULL ||
		AfxIsValidAddress(m_lpBufCur, UINT(m_lpBufMax - m_lpBufCur), IsStoring()));

	if (IsLoading())   //如果是读操作
Carchive 是一个MFC,用于在计算机程序中对数据进行归档、存储和检索。它提供了对序列化对象和数据进行管理的功能。 Carchive 可以将对象和数据序列化到文件或内存缓冲区,并可以根据需要进行反序列化以恢复对象和数据。它支持多种存储格式,如二进制、文本和XML。使用Carchive,可以轻松地将复杂的对象层次结构保存到文件中,并在需要时进行检索和重新加载。 Carchive 提供了一组成员函数,用于操作数据的序列化和反序列化。它们包括 Serialize、Read、Write 和 GetFile。 Carchive 似于一个桥梁,将程序中的数据和对象与存储设备连接起来。它提供了在存储设备上读取和写入数据的方法,使得程序能够从存储设备中加载数据,并将数据保存到存储设备中。 与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、付费专栏及课程。

余额充值