CArchive::MapObject
更新 : 2007 年 11 月
ファイルに実際にシリアル化されない、参照のサブオブジェクトとして使用できるオブジェクトをマップに配置します。
void MapObject(
const CObject* pOb
);
パラメータ
- pOb
格納されるオブジェクトへの定数ポインタ。
解説
たとえば、ドキュメントをシリアル化せずに、ドキュメントの一部であるアイテムをシリアル化する場合があります。MapObject を呼び出すと、ドキュメントのアイテムまたはサブオブジェクトで、ドキュメントを参照できます。また、シリアル化されたサブアイテムでは、その m_pDocument バック ポインタをシリアル化できます。
CArchive オブジェクトを保存したり、このオブジェクトから読み込んだりする場合は、MapObject を呼び出します。MapObject は、シリアル化と逆シリアル化において CArchive オブジェクトが維持する内部データ構造体に指定されたオブジェクトを追加します。ただし、ReadObject や WriteObject とは異なり、オブジェクトに対してシリアル化は呼び出しません。
使用例
//MyDocument.h
class CMyDocument : public CDocument
{
public:
DECLARE_SERIAL(CMyDocument)
CObList m_listOfSubItems;
virtual void Serialize(CArchive& ar);
};
//MyDocument.cpp
IMPLEMENT_SERIAL(CMyDocument, CDocument, 1)
void CMyDocument::Serialize(CArchive& ar)
{
CDocument::Serialize(ar);
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
ar.MapObject(this);
//serialize the subitems in the document;
//they will be able to serialize their m_pDoc
//back pointer
m_listOfSubItems.Serialize(ar);
}
//SubItem.h
class CSubItem : public CObject
{
DECLARE_SERIAL(CSubItem)
CSubItem() : m_i(0) {};
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
IMPLEMENT_SERIAL(CSubItem, CObject, 1);
void CSubItem::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// will serialize a reference
// to the "mapped" document pointer
ar << (CObject *)m_pDoc;
ar << m_i;
}
else
{
// Will load a reference to
// the "mapped" document pointer
ar >> (CObject *&) m_pDoc;
ar >> m_i;
}
}
必要条件
ヘッダー : afx.h