CArchive::MapObject

void MapObject(const CObject* pOb);

参数:
pOb指向正在存储的对象的指针。

说明:
调用此成员函数在映射中放置对象。此映射没有真的对文件串行化,但是对参考的子对象有效。举例来说,可能不想串行化一个文档,但是想对作为文档一部分的项串行化。通过调用MapObject,可允许那些项或子对象参考文档。而且,串行化子项还可以串行化它们的m_pDocument向后的指针。
当要把数据存储到CArchive对象和从它装载数据时,可以调用MapObject。在串行化和非串行化的过程中,MapObject向由CArchive保持的内部数据结构添加特定的对象,但是它不象ReadObject和WriteObject那样,它不会对对象串行化。

示例:
//MyDoc.h
//Document should have DECLEAR_SERIAL and IMPLEMENT_SERIAL
class CMyDocument: public CDocument
{
  CObList m_listOfSubItems;
  ...
  DECLARE_SERIAL(CMyDocument)
};
//MyDoc.cpp
...
IMPLEMENT_SERIAL(CMyDocument.CObject,1)
...
void CMyDocument::Serialize(CArchive& ar)
{
  if (ar.IsStoring( ))
  {
    //TODO:add storing code here
  }
  else
  {
    //TODO:add loading code here
  }
  ar.MapObject(this);
  //serialize the subitems in the documents;
  //they will be able to serialize their m_pDoc
  //back pointer
  m_listOfSubItems.Serialize(ar);
}

//SubItem.h
class CSubItem:public CObject
{
  public:
   CSubItem(CMYDocument * pdoc) { m_pDoc = pDoc }
   //back pointer to owning document
   CMYDocument* m_pDoc
   WORD m_I; //other item data
   virtual void Serialize(CArchive& ar);
};

//SubItem.cpp
void CSubItem:Serialize(CArchive& ar)
{
  if (ar.IsStoring( ))
  {
    //will serializing a reference
    //to the “mapped”document pointer
    ar <     ar<   }
  else
  {
    //will load a reference to
    //the “mapped”document pointer
    ar >>m_pDoc;
    ar >>m_i;
  }
}

请参阅:CArchive::ReadObject, CArchive::WriteObject