Программирование на языке MFC

Мой второй блог в серии программирования

Класс CArchive


Естественно, что сериализация неразрывно связана с файла­ми. Но для осуществления сериализации объекты класса CFile слишком громоздки. Поэтому для сериализации используются так называемые архивы. Архив создается на базе файла и обеспечи­вает более удобные средства для осуществления записи объектов в файл. Класс CArchive в файле afx.h описан следующим образом:

class CArchive {

public:

// Flag values

enum Mode { store = 0, load = 1Г

bNoFlushOnDelete = 2, bNoByteSwap = 4 };

CArchive(CFile* pFile,

UINT nMode,

int nBufSize = 4096,

void* lpBuf = NULL); -CArchive();

// Attributes

BOOL IsLoadingO const; BOOL IsStoringO const; BOOL IsByteSwapping() const; BOOL IsBufferEmpty() const; CFile* GetFileO const;

UINT GetObjectSchema(); // only valid when reading

// a CObject* void SetObjectSchema(UINT nSchema);

// pointer to document being serialized — must set // to serialize COleClientltems in a document! CDocument* m_pDocument;

// Operations

UINT Read(void* lpBuf, UINT nMax);

void Write(const void* lpBuf, UINT nMax);

void Flush(); void Close();

void Abort(); // close and shutdown without exceptions

// reading and writing strings

void WriteString(LPCTSTR lpsz);

LPTSTR ReadString(LPTSTR lpsz, UINT nMax);

BOOL ReadString(CStringS rString);

public:

// Object I/O is pointer based to avoid added // construction overhead.

// Use the Serialize member function directly for // embedded objects.

friend CArchive& AFXAPI operator«(CArchive& ar,

const CObject* pOb);

friend CArchiveS AFXAPI operator»(CArchive& ar,

CObject*& pOb); friend CArchive& AFXAPI operator>>(CArchive& ar,

const CObject*& pOb);

// insertion operations CArchive& operator« (BYTE by) ; CArchiveS operator« (WORD w) ; CArchiveS operator« (LONG 1) ; CArchive& operator« (DWORD dw) ; CArchiveS operator« (float f) ; CArchive& operator« (double d) ; CArchive& operator<< (int i); CArchive& operator<<(short w); CArchive& operator<< (char ch); CArchive& operator<<(unsigned u);

// extraction operations CArchiveS operator» (BYTE& by) ; CArchive& operator>>(W0RD& w); CArchive& operator» (DWORDS dw) ; CArchive& operator» (L0NG& 1) ; CArchive& operator» (floats f) ; CArchive& operator>>(doubles d);

CArchive& operator>>(int& i);

CArchive& operator>>(short& w); CArchive& operator>>(char& ch); CArchive& operator>>(unsigned& u);

// object read/write

CObject* ReadObject(const CRuntimeClass* pClass); void WriteObject(const CObject* pOb);

// advanced object mapping (used for forced references) void MapObject(const CObject* pOb);

// advanced versioning support

void WriteClass(const CRuntimeClass* pClassRef);

CRuntimeClass* ReadClass(const CRuntimeClass*

pClassRefRequested = NULL, UINT* pSchema = NULL, DWORD* pObTag = NULL);

void SerializeClass(const CRuntimeClass* pClassRef);

// advanced operations (used when storing/loading // many objects)

void SetStoreParams(UINT nHashSize = 2053,

UINT nBlockSize = 128); void SetLoadParams(UINT nGrowBy = 1024);

// Implementation public:

BOOL m_bForceFlat; // for COleClientltem implementation

// (default TRUE) BOOL m_bDirectBuffer; // TRUE if m_pFile supports

// direct buffering void FillBuffer(UINT nBytesNeeded);

void CheckCount(); // throw exception if m_nMapCount

// is too large

// special functions for reading and writing

// (16-bit compatible) counts

DWORD ReadCount();

void WriteCount(DWORD dwCount);

// public for advanced use UINT m_nObjectSchema; CString m_strFileName;

protected:

// archive objects cannot be copied or assigned

CArchive(const CArchive& arSrc);

void operator= (const CArchive& arSrc);

BOOL m_nMode; BOOL m_bUserBuf; int m_nBufSize;

CFile* m_pFile; «’

BYTE* m_lpBufCur; BYTE* m_lpBufMax; BYTE* m_lpBufStart;

// array/map for CObject* and CRuntimeClass* load/store

UINT m_nMapCount;

union

{

CPtrArray* m_pLoadArray; CMapPtrToPtr* m_pStoreMap;

};

// map to keep track of mismatched schemas CMapPtrToPtr* mjpSchemaMap;

// advanced parameters (controls performance with // large archives) UINT m_nGrowSize; UINT m_nHashSize;

};

Давайте попробуем разобраться в принципах работы архива. Для того чтобы создать архив, необходимо, естественно, восполь­зоваться конструктором класса.

Похожие статьи: