CArchive 對(duì)象提供了一個(gè)類型安全緩沖機(jī)制 CArchive 對(duì)象提供了一個(gè)類型安全緩沖機(jī)制。用于將可序列化對(duì)象寫入 CFile 對(duì)象或從中讀取可序列化對(duì)象。通常, CFile 對(duì)象表示磁盤文件;但是,它也可以是表示“剪貼板”的內(nèi)存文件(CSharedFile 對(duì)象) 。
CArchive
允許以一個(gè)永久
二進(jìn)制
(通常為
磁盤存儲(chǔ)
)的形式保存一個(gè)對(duì)象的復(fù)雜網(wǎng)絡(luò),它可以在對(duì)象被刪除時(shí),還能永久保存。可以從永久存儲(chǔ)中裝載對(duì)象,在內(nèi)存中重新構(gòu)造它們。使得數(shù)據(jù)永久保留的過程就叫作“
串行化
”。
CArchive
支持基本數(shù)據(jù)類型(
BYTE、WORD、LONG、DWORD、float、double、int、short、char、unsigned CString
),
CObject
派生的類對(duì)象,,同時(shí)也支持
CSocket,CSocketFile。
構(gòu)造
?
CArchive:
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL
);
參數(shù):
pFile
為了使持久性數(shù)據(jù)的最終源或目標(biāo)的 CFile 對(duì)象的指針。
nMode
指定的標(biāo)志對(duì)象是否將填充或存儲(chǔ)到存檔。 nMode 參數(shù)必須具有下列值之一:
CArchive::load 從存檔加載數(shù)據(jù)。 需要 CFile 僅讀取權(quán)限。
CArchive::store 將數(shù)據(jù)保存到存檔。 需要 CFile 寫權(quán)限。
當(dāng)存檔析構(gòu)函數(shù)調(diào)用時(shí),CArchive::bNoFlushOnDelete 防止存檔自動(dòng)調(diào)用 Flush。 如果設(shè)置此標(biāo)志,您負(fù)責(zé)顯式調(diào)用 Close,在調(diào)用析構(gòu)函數(shù)之前。 如果不,數(shù)據(jù)將損壞。
nBufSize
指定文件內(nèi)部緩沖區(qū)的大小的整數(shù),以字節(jié)為單位)。 請(qǐng)注意默認(rèn)緩沖區(qū)大小為4,096字節(jié)。 如果您定期存檔大型對(duì)象,您將提高性能,如果您使用的是文件緩沖區(qū)大小的多個(gè)的一個(gè)更大的緩沖區(qū)大小。
lpBuf
該范圍 nBufSize用戶提供的緩沖區(qū)的可選指針。 如果未指定此參數(shù),存檔從本地堆分配緩沖區(qū)并釋放它,當(dāng)銷毀對(duì)象時(shí)。 存檔不釋放用戶提供的緩沖區(qū)。
備注:
您不能使用 CFile 操作修改文件的狀態(tài),直到您關(guān)閉了存檔。 任何此類操作將損壞存檔的完整性。 在序列化時(shí)在+任何+時(shí)間可以訪問文件指針的位置。獲取存檔文件對(duì)象從 GetFile 成員函數(shù)然后使用 CFile::GetPosition 功能。 您應(yīng)在獲取文件指針的位置之前調(diào)用 CArchive::Flush。
下面是示例代碼(CArchiveDemo)
?
// Person.h: interface for the CPerson class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_PERSON_H__B12B4253_72D0_49D4_98FE_88145950801B__INCLUDED_) #define AFX_PERSON_H__B12B4253_72D0_49D4_98FE_88145950801B__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CPerson : public CObject //繼承CObject對(duì)象 { DECLARE_SERIAL(CPerson)//手動(dòng)添加 private: CString m_strName; unsigned m_uAge; public: CPerson(); virtual ~CPerson(); VOID SetName(CString name); CString GetName(); VOID SetAge(unsigned age); unsigned GetAge(); virtual VOID Serialize(CArchive& ar);//重載CObject對(duì)象方法 }; #endif // !defined(AFX_PERSON_H__B12B4253_72D0_49D4_98FE_88145950801B__INCLUDED_)
?
// Person.cpp: implementation of the CPerson class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "CArchiveDemo.h" #include "Person.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IMPLEMENT_SERIAL(CPerson, CObject, 1)//手動(dòng)去添加 CPerson::CPerson() { m_uAge = 0; } CPerson::~CPerson() { } VOID CPerson::SetName(CString name) { m_strName = name; } CString CPerson::GetName() { return m_strName; } VOID CPerson::SetAge(unsigned age) { m_uAge = age; } unsigned CPerson::GetAge() { return m_uAge; } VOID CPerson::Serialize(CArchive& ar) { if (ar.IsLoading())//加載 ar >> this->m_strName >> this->m_uAge; else ar << this->m_strName << this->m_uAge; }
// CArchiveDemo.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "CArchiveDemo.h" #include "Person.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //1>CArchive對(duì)基本類型支持 //CArchive寫操作 CFile myfile("info.txt", CFile::modeCreate|CFile::modeReadWrite); CArchive ar_s(&myfile, CArchive::store); WORD wAge_s = 28; ar_s << wAge_s; ar_s.Close(); myfile.Close(); //CArchive讀操作 myfile.Open("info.txt", CFile::modeRead); CArchive ar_l(&myfile, CArchive::load); WORD wAge_l = 0; ar_l >> wAge_l; ar_l.Close(); myfile.Close(); //2>CArchive對(duì)類對(duì)象支持 CPerson Zhang; Zhang.SetName("張三"); Zhang.SetAge(23); CPerson Li; Li.SetName("李四"); Li.SetAge(27); //CArchive寫操作 CFile fperson("person_info.txt", CFile::modeCreate|CFile::modeWrite); CArchive ar_store(&fperson, CArchive::store); ar_store << &Zhang << &Li;//序列化寫入 ar_store.Close(); fperson.Close(); //CArchive讀操作 CPerson *p1 = NULL, * p2 = NULL; fperson.Open("person_info.txt", CFile::modeRead); CArchive ar_load(&fperson, CArchive::load); ar_load >> p1 >> p2;//序列化讀入 ar_load.Close(); fperson.Close(); //打印以下讀入數(shù)據(jù) printf("name:%s,age:%u\n",p1->GetName(), p1->GetAge()); printf("name:%s,age:%u\n",p2->GetName(), p2->GetAge()); delete p1; p1 = NULL; delete p2; p2 = NULL; return 0; }
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
