CArchive

CArchive

CArchive 對象提供了一個類型安全緩衝機制,用於將可序列化對象寫入 CFile 對象或從中讀取可序列化對象。通常,CFile 對象表示磁碟檔案;但是,它也可以是表示“剪貼簿”的記憶體檔案(CSharedFile 對象)。

基本介紹

  • 中文名:CArchive
  • 提供類型安全緩衝機制
  • 用於:可序列化對象寫入 CFile 對象
  • 表示剪貼簿”的記憶體檔案
名詞解釋,CArchive的局限性,CRuntimeClass,CArchive 詳解,CArchive沒有基類,CArchive類的成員,參數,

名詞解釋

CArchive的局限性

給定的 CArchive 對象要么存儲數據(即寫入數據或將數據序列化),要么載入數據(即讀取數據或將數據反序列化),但決不能同時進行。CArchive 對象的壽命只限於將對象寫入檔案或從檔案讀取對象的一次傳遞。因此,需要兩個連續創建的 CArchive 對象將數據序列化到檔案,然後從檔案反序列化數據。

CRuntimeClass

當存檔將對象存儲到檔案時,存檔將 CRuntimeClass 名稱附加到這些對象。然後,當另一個存檔將對象從檔案載入到記憶體時,將基於這些對象的 CRuntimeClass 動態地重新構造 CObject 派生的對象。通過存儲存檔將給定對象寫入檔案時,該對象可能被引用多次。然而,載入存檔將僅對該對象重新構造一次。有關存檔如何將 CRuntimeClass 信息附加到對象以及重新構造對象(考慮可能的多次引用)的詳細信息。
將數據序列化到存檔時,存檔積累數據,直到其緩衝區被填滿為止。然後,存檔將其緩衝區寫入 CArchive 對象指向的 CFile 對象。同樣,當您從存檔中讀取數據時,存檔會將數據從檔案讀取到它的緩衝區,然後從緩衝區讀取到反序列化的對象。這種緩衝減少了物理讀取硬碟的次數,從而提高了應用程式的性能。
CArchive使用緩衝區作為臨時數據存儲地,讀寫都先依次排列到此緩衝區,當緩衝區滿或用戶要求時,將此段整理後的數據讀寫到指定的存儲介質。 好比火車貨場裝運零散的貨物被收集,當總量到達火車運量的時候,由火車裝運走。

CArchive 詳解

CArchive沒有基類

CArchive允許以一個永久二進制(通常為磁碟存儲)的形式保存一個對象的複雜網路,它可以在對象被刪除時,還能永久保存。可以從永久存儲中裝載對象,在記憶體中重新構造它們。使得數據永久保留的過程就叫作“串列化”。
可以把一個歸檔對象看作一種二進制流。像輸入/輸出流一樣,歸檔與檔案有關並允許寫緩衝區以及從硬碟讀出或讀入數據。輸入/輸出流處理一系列ASCII字元,但是歸檔檔案以一種有效率、精練的格式處理二進制對象。
必須在創建一個CArchive對象之前,創建一個CFile對象。另外,必須確信歸檔檔案的裝入/存儲與檔案的打開模式是兼容的。每一個檔案只限於一個活動歸檔檔案。
當構造一個CArchive對象時,要把它附加給表示一個打開檔案的類CFile(或派生類)的對象上。還要指定歸檔檔案將用於裝載還是存儲。CArchive對象不僅可以處理首要類型,而且還能處理為串列化而設計的CObject_派生類的對象。一個串列化類通常有一個Serialize成員函式並且使用DECLARE_SERIAL和IMPLEMENT_SERIAL宏。這些在CObject類中有所描述。
重載提取(>>)和插入(<<)是方便的歸檔編程接口。它支持主要類型和CObject派生類。
CArchive還支持使用MFC Windows套接字CSocketCSocketFile編程。IsBufferEmpty成員函式也支持這種使用。如果要了解有關CArchive的更多信息,請參閱在線上文檔“Visual C++ 程式設計師指南”中的“串列化(永久對象)” 和“Windows套接字:在歸檔檔案中使用套接字”
include<afx.h>
請參閱 CFile,CObject,CSocket,CSocketFile

CArchive類的成員

數據成員
m_pDocument 指向被串列化CDocument對象
CArchive 創建一個CArhcive對象
Abort在不異常的情況下,關閉歸檔檔案
Close衝掉未寫入數據並且釋放與CFile的連線
基礎輸入/輸出
Flush從歸檔檔案緩衝區中衝掉未寫入數據
運算符>>裝載對象和歸檔檔案的主要類型
運算符<<存儲對象和歸檔檔案的主要類型
Read讀入原始類型
Write寫入原始類型
WriteString寫一行文本
ReadString讀一行文本
狀態
GetFile獲得此歸檔檔案的
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 );

參數

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”<<”\n”;
exit(1);
}
CArchive ar( &f, CAchive::strore,512,buf);
請參閱 CArchive::Close,
CArchive::Flush,
CFile::Close
CArchive::Close
void Close( )
說明
衝掉保存在緩衝區中的任何數據,關閉歸檔檔案並且釋放歸檔檔案與檔案的連結。對於歸檔檔案沒有允許的其它操作。在關閉一個歸檔檔案之後,可以為一個同樣檔案創建另一個歸檔檔案或者關閉檔案。成員函式Close保證所有數據從歸檔檔案傳輸到檔案並且使歸檔檔案無效。為了完成從檔案到存儲介質的傳輸,必須首先使用CFile::Close並且再毀棄CFile對象。
請參閱 CArchive::Flush,
CArchive::Abort
CArchive::Flush
void Flush( );
throw( CFileException);
說明
迫使保留在歸檔檔案中的數據寫入檔案。成員函式Flush保證所有的數據從歸檔檔案傳輸到檔案。必須調用CFile::Close來完成從檔案到存儲介質的

相關詞條

熱門詞條

聯絡我們