Stockage et chargement de CObjects via une archive
Le stockage et le chargement CObject
de s via une archive nécessitent une considération supplémentaire. Dans certains cas, vous devez appeler la Serialize
fonction de l’objet, où l’objet CArchive
est un paramètre de l’appelSerialize
, par opposition à l’utilisation de l’opérateur ou >> du << CArchive
. Le fait important à garder à l’esprit est que l’opérateur CArchive
>> construit la CObject
mémoire en CRuntimeClass
fonction des informations précédemment écrites dans le fichier par l’archive de stockage.
Par conséquent, si vous utilisez les CArchive
<< opérateurs et >> opérateurs, plutôt que d’appeler Serialize
, dépend si vous avez besoin de l’archive de chargement pour reconstruire dynamiquement l’objet en fonction des informations précédemment stockées CRuntimeClass
. Utilisez la Serialize
fonction dans les cas suivants :
Lors de la désérialisation de l’objet, vous connaissez la classe exacte de l’objet au préalable.
Lors de la désérialisation de l’objet, vous disposez déjà de la mémoire allouée.
Attention
Si vous chargez l’objet à l’aide de la Serialize
fonction, vous devez également stocker l’objet à l’aide de la Serialize
fonction. Ne stockez pas à l’aide de l’opérateur CArchive
<< , puis chargez à l’aide de la Serialize
fonction, ou stockez à l’aide de la Serialize
fonction, puis chargez l’opérateur CArchive >>
.
L’exemple suivant illustre les cas suivants :
class CMyObject : public CObject
{
// ...Member functions
public:
CMyObject() {}
virtual void Serialize(CArchive &ar);
// Implementation
protected:
DECLARE_SERIAL(CMyObject)
};
class COtherObject : public CObject
{
// ...Member functions
public:
COtherObject() {}
virtual void Serialize(CArchive &ar);
// Implementation
protected:
DECLARE_SERIAL(COtherObject)
};
class CCompoundObject : public CObject
{
// ...Member functions
public:
CCompoundObject();
~CCompoundObject();
virtual void Serialize(CArchive &ar);
// Implementation
protected:
CMyObject m_myob; // Embedded object
COtherObject *m_pOther; // Object allocated in constructor
CObject *m_pObDyn; // Dynamically allocated object
//..Other member data and implementation
DECLARE_SERIAL(CCompoundObject)
};
IMPLEMENT_SERIAL(CMyObject, CObject, 1)
IMPLEMENT_SERIAL(COtherObject, CObject, 1)
IMPLEMENT_SERIAL(CCompoundObject, CObject, 1)
CCompoundObject::CCompoundObject()
{
m_pOther = new COtherObject; // Exact type known and object already
//allocated.
m_pObDyn = NULL; // Will be allocated in another member function
// if needed, could be a derived class object.
}
CCompoundObject::~CCompoundObject()
{
delete m_pOther;
}
void CCompoundObject::Serialize(CArchive &ar)
{
CObject::Serialize(ar); // Always call base class Serialize.
m_myob.Serialize(ar); // Call Serialize on embedded member.
m_pOther->Serialize(ar); // Call Serialize on objects of known exact type.
// Serialize dynamic members and other raw data
if (ar.IsStoring())
{
ar << m_pObDyn;
// Store other members
}
else
{
ar >> m_pObDyn; // Polymorphic reconstruction of persistent object
//load other members
}
}
En résumé, si votre classe sérialisable définit un incorporé CObject
en tant que membre, vous ne devez pas utiliser les opérateurs et >> les CArchive
<< opérateurs de cet objet, mais appeler la fonction à la Serialize
place. En outre, si votre classe sérialisable définit un pointeur vers un CObject
(ou un objet dérivé de CObject
) en tant que membre, mais construit cet autre objet dans son propre constructeur, vous devez également appeler Serialize
.