首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CArchive类!解决思路

2012-03-05 
CArchive类!voidCPerson::Serialize(CArchive&ar)//自定义的串行化函数!{CObject::Serialize(ar)if(ar.Is

CArchive类!
void   CPerson::Serialize(CArchive   &ar)//自定义的串行化函数!
{
CObject::Serialize(ar);
if   (ar.IsStoring())
{
ar < <m_sName < <m_iAge < <m_iMaritalStatus < <m_bEmployed;
}
else
{
ar> > m_sName> > m_iAge> > m_iMaritalStatus> > m_bEmployed;
}/**/
}

class   CMFC_SerializeView   :   public   CFormView
{
protected:   //   create   from   serialization   only
......
private:
CPerson*   m_pCurPerson;自定义的类指针!
void   PopulateView();
};

class   CMFC_SerializeDoc   :   public   CDocument
{
.....
private:

CObArray   m_oaPeople;//指向一个CPerson类!COArray可以存放任何从CObject派生出的对象!
int   m_iCurPostition;
};

void   CMFC_SerializeDoc::Serialize(CArchive&   ar)
{
m_oaPeople.Serialize(ar);
}


请问最后一段代码中的“m_oaPeople.Serialize(ar);”为什么就可以实现全部的数据读取?
谢谢!

[解决办法]
仅仅凭这几行代码,应该不行
[解决办法]
根本原因在于CObjArray和CObject的Seriarize方法,你可以在Serialize上按F12进去看它的源代码。
[解决办法]
CObjArray的Serialize调用时调用其每个元素的Serialize函数

/////////////////////////////////////////////////////////////////////////////
// Serialization

void CObArray::Serialize(CArchive& ar)
{
ASSERT_VALID(this);

CObject::Serialize(ar);

if (ar.IsStoring())
{
ar.WriteCount(m_nSize);
for (INT_PTR i = 0; i < m_nSize; i++)
ar < < m_pData[i];
}
else
{
DWORD_PTR nOldSize = ar.ReadCount();
SetSize(nOldSize);
for (INT_PTR i = 0; i < m_nSize; i++)
ar > > m_pData[i];
}
}

[解决办法]

ar > > 和 ar < < 由 ar.IsStoring()决定, 而ar.IsSroring又由 创建时设置的mode也就是CArchive::store或CArchive::load决定。

热点排行