16,470
社区成员
发帖
与我相关
我的任务
分享
#define DECLARE_SERIAL(class_name) \
_DECLARE_DYNCREATE(class_name) \
AFX_API friend CArchive& AFXAPI operator >>(CArchive& ar, class_name* &pOb); //友元函数重载>>操作符
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
extern AFX_CLASSINIT _init_##class_name; \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject, &_init_##class_name) \
AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; } \
为了在每一个对象被处理(读或写)之前,能够处理琐屑的工作,诸如判断是否是第一次出现、记录版本号码、记录文件名等工作,CRuntimeClass结构需要2个函数Load和Store:
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif
// Operations
CObject* CreateObject();
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
// dynamic name lookup and creation
static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);
static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
static CObject* PASCAL CreateObject(LPCSTR lpszClassName);
static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);
// Implementation
void Store(CArchive& ar) const;//存储类名称
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);//读取类名称
// CRuntimeClass objects linked together in simple list
CRuntimeClass* m_pNextClass; // linked list of registered classes
const AFX_CLASSINIT* m_pClassInit;
};
CRuntimeClass* PASCAL CRuntimeClass::Load(CArchive& ar, UINT* pwSchemaNum)
{
WORD nLen;
char szClassName[64];
CRuntimeClass* pClass;
ar >> (WORD&)(*pwSchemaNum) >> nLen;
if(nLen >= sizeof(szClassName) || ar.Read(szClassName, nLen) != nLen )
return NULL;
szClassName[nLen] = '\0';
for(pClass = pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass)
{
if(llstrcmp(szClassName,pClass->m_lpszClassName) == 0)
return pClass;
}
return NULL;
}
void CRuntimeClass::Store(CArchive& ar) const
{
WORD nLen = (WORD)lstrlenA(m_lpszClassName);
ar << (WORD)m_wSchema << nLen;
ar.Write(m_lpszClassName, nLen*sizeof(char));
}
#include <iostream.h>
void main()
{
int a;
cout<<"Please enter an integer:\n";
cin>>a;
cout<<"a: "<<a<<endl;
}
再来说说你的这个代码:
void CScribDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring()) //如果是在存储归档文件(也就是把数据存储到文档中)
ar << m_sizeDoc; //那么就将 m_sizeDoc 变量插入输出流中。这里输出流对象是 CArchive 类的对象 ar ,并且通常情况下 ar 已经和某个特定的文档关联起来了,那么将变量插入输出流中,就是将变量的值写入文档
else //如果当前是在读取归档文件(也就是从文档中读取数据)
ar >> m_sizeDoc; //同上。这里输入流对象是 ar ,那么就是从 ar 中提取数据并将数据保存到 m_sizeDoc 变量中
m_graphList.Serialize(ar); //调用 m_graphList 的 Serialize 函数
}
CArchive类重载了operator << 和operator <<操作符