Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Lagring och inläsning av CObject via ett arkiv kräver extra eftertanke. I vissa fall bör du anropa Serialize-funktionen för objektet, där CArchive-objektet är en parameter för Serialize-anropet, i stället för att använda <<- eller >>-operatorn för CArchive. Det viktiga att tänka på är att operatorn CArchive>> konstruerar CObject i minnet baserat på CRuntimeClass information som tidigare skrivits till filen av lagringsarkivet.
Om du använder operatorerna CArchive<< och >> eller anropar Serializeberor därför på om du behöver inläsningsarkivet för att dynamiskt rekonstruera objektet baserat på tidigare lagrad CRuntimeClass information.
Serialize Använd funktionen i följande fall:
När du deserialiserar objektet vet du den exakta klassen för objektet i förväg.
När objektet deserialiseras har du redan allokerat minne för det.
Försiktighet
Om du läser in objektet med hjälp av Serialize funktionen måste du också lagra objektet med hjälp av Serialize funktionen . Lagra inte med operatorn CArchive<< och läs sedan in med funktionen Serialize eller lagra med hjälp av Serialize funktionen och läs sedan in med operatorn CArchive >> .
I följande exempel visas fallen:
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
}
}
Sammanfattningsvis, om din serialiserbara klass definierar en inbäddad CObject som medlem, bör du inte använda operatorerna CArchive<< och >> för objektet, utan anropa Serialize funktionen i stället. Om din serialiserbara klass definierar en pekare till en CObject (eller ett objekt härlett från CObject) som medlem, men konstruerar det andra objektet i klassens egen konstruktor, bör du också anropa Serialize.