

Программирование на языке 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;
};
Давайте попробуем разобраться в принципах работы архива. Для того чтобы создать архив, необходимо, естественно, воспользоваться конструктором класса.
Похожие статьи: Класс CArchive
