按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
。。。
loadArchive。Close();
ReleaseFile(pFile; FALSE);
}
operator》
CArchive 针对许多C++ 数据类型、Windows 数据类型以及CObject 衍生类别,定义
operator》 多载运算子:
// in 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 IsLoading() const;
BOOL IsStoring() const;
BOOL IsByteSwapping() const;
BOOL IsBufferEmpty() const;
CFile* GetFile() const;
532
…………………………………………………………Page 595……………………………………………………………
第8章 Document…View 深入探討
UINT GetObjectSchema(); // only valid when reading a CObject*
void SetObjectSchema(UINT nSchema);
// pointer to document being serialized …must set to serialize
// COleClientItems 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(CString& 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; CObject*& pOb);
friend CArchive& AFXAPI operator》》(CArchive& ar; const CObject*& pOb);
// insertion operations
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);
。。。
protected:
// 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* m_pSchemaMap;
。。。
};
这些多载运算子均定义于AFX。INL 文件中。另有些函数可能你会觉得眼熟,没错,它
们在稍早的「台面下的Serialize 奥秘」中已经出现过了,它们是ReadObject 、WriteObject 、
ReadClass 、WriteClass。
各种类型的operator》》 和operator》(CArchive& ar; const CObject*& pOb)
{ pOb = ar。ReadObject(NULL); return ar; }
其中CArchive::WriteObject 先把类别的CRuntimeClass 信息写出, 再调用类别的
Serialize 函数。CArchive::ReadObject 的行为类似,先把类别的CRuntimeClass 信息读入,
再调用类别的Serialize 函数。Serialize 是CObject 的虚拟函数,因此你必须确定你的
类别改写的Serialize 函数的回返值和参数类型都符合CObject 中的声明:传回值为
void ,唯一一个参数为CArchive&。
注意:CString、CRect、CSize、CPoint 并不衍生自CObject,但它们也可以直接使用针
对CArchive 的》 运算子,因为它们自己设计了一套:
// in AFX。H
class CString
{
friend CArchive& AFXAPI operator(CArchive& ar; CString& string);
。。。
};
// in AFXWIN。H
// Serialization
CArchive& AFXAPI operator(CArchive& ar; RECT& rect);
一个类别如果希望有Serialization 机制,它的第二要件就是使用SERIAL 宏。这个巨
集包容DYNCREATE 宏,并且在类别的声明之中加上:
friend CArchive& AFXAPI operator》》(CArchive& ar; class_name* &pOb);
在类别的实作档中加上:
CArchive& AFXAPI operator》》(CArchive& ar; class_name* &pOb)
{ pOb = (class_name*) ar。ReadObject(RUNTIME_CLASS(class_name));
return ar; }
535
…………………………………………………………Page 598……………………………………………………………
第篇 深入 MFC 程式設計