CArchive::MapObject
void MapObject(const CObject* 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