CArchive 對象提供了一個類型安全緩沖機制 CArchive 對象提供了一個類型安全緩沖機制。用于將可序列化對象寫入 CFile 對象或從中讀取可序列化對象。通常, CFile 對象表示磁盤文件;但是,它也可以是表示“剪貼板”的內存文件(CSharedFile 對象) 。
CArchive
允許以一個永久
二進制
(通常為
磁盤存儲
)的形式保存一個對象的復雜網絡,它可以在對象被刪除時,還能永久保存??梢詮挠谰么鎯χ醒b載對象,在內存中重新構造它們。使得數據永久保留的過程就叫作“
串行化
”。
CArchive
支持基本數據類型(
BYTE、WORD、LONG、DWORD、float、double、int、short、char、unsigned CString
),
CObject
派生的類對象,,同時也支持
CSocket,CSocketFile。
構造
?
CArchive:
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL
);
參數:
pFile
為了使持久性數據的最終源或目標的 CFile 對象的指針。
nMode
指定的標志對象是否將填充或存儲到存檔。 nMode 參數必須具有下列值之一:
CArchive::load 從存檔加載數據。 需要 CFile 僅讀取權限。
CArchive::store 將數據保存到存檔。 需要 CFile 寫權限。
當存檔析構函數調用時,CArchive::bNoFlushOnDelete 防止存檔自動調用 Flush。 如果設置此標志,您負責顯式調用 Close,在調用析構函數之前。 如果不,數據將損壞。
nBufSize
指定文件內部緩沖區的大小的整數,以字節為單位)。 請注意默認緩沖區大小為4,096字節。 如果您定期存檔大型對象,您將提高性能,如果您使用的是文件緩沖區大小的多個的一個更大的緩沖區大小。
lpBuf
該范圍 nBufSize用戶提供的緩沖區的可選指針。 如果未指定此參數,存檔從本地堆分配緩沖區并釋放它,當銷毀對象時。 存檔不釋放用戶提供的緩沖區。
備注:
您不能使用 CFile 操作修改文件的狀態,直到您關閉了存檔。 任何此類操作將損壞存檔的完整性。 在序列化時在+任何+時間可以訪問文件指針的位置。獲取存檔文件對象從 GetFile 成員函數然后使用 CFile::GetPosition 功能。 您應在獲取文件指針的位置之前調用 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對象
{
DECLARE_SERIAL(CPerson)//手動添加
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對象方法
};
#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)//手動去添加
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對基本類型支持
//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對類對象支持
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();
//打印以下讀入數據
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;
}
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

