读书人

CArchive类!解决思路

发布时间: 2012-03-05 11:54:02 作者: rapoo

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决定。

读书人网 >VC/MFC

热点推荐