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);”为什么就可以实现全部的数据读取?
谢谢!

解决方案 »

  1.   

    根本原因在于CObjArray和CObject的Seriarize方法,你可以在Serialize上按F12进去看它的源代码。
      

  2.   

    是不是CObjArray的Serialize调用时调用其每个元素的Serialize函数啊?
      

  3.   

    CObjArray的Serialize调用时调用其每个元素的Serialize函数/////////////////////////////////////////////////////////////////////////////
    // Serializationvoid 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];
    }
    }
      

  4.   

    何时对成员调用直接Serialize(CArchive& ar)?何时调用ar >> 、ar << ?接此机会想听听各位的看法
      

  5.   


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