Depolama ve CObjects bir arşiv üzerinden yükleniyor
Depolama ve yükleme CObjects arşiv yoluyla ek dikkate gerektirir. Belirli durumlarda, çağırmalıdır Serialize nesnesinin işlevi burada CArchive nesnesi bir parametresi olan Serialize karşıt olarak kullanarak arama, << veya >> işletmeni, CArchive. Akılda tutulması gereken önemli bir gerçeği olan CArchive>> operator yapıları CObject göre bellekte CRuntimeClass daha önce dosya saklama arşiv tarafından yazılan bilgilerin.
Bu nedenle, kullanıp CArchive<< ve >> karşılaştırmalı arama operatörleri Serialize, bağlıdır, gerek dinamik nesneyi yeniden oluşturmak için Arşiv yüklenirken temel alınarak önceden saklanan CRuntimeClass bilgi. Use Serialize işlevi aşağıdaki durumlarda:
Nesnenin serisi kaldırılırken, tam sınıf nesnesi önceden biliyor.
Nesnenin serisi kaldırılırken, bunun için ayrılan bellek zaten sahipsiniz.
Uyarı
Nesnesini kullanarak yüklerseniz Serialize işlevini kullanarak nesne depolamalısınız Serialize işlevi.Kullanarak depolama CArchive<< operatörünü ve ardından yükleme kullanarak Serialize işlev veya kullanarak depolamak Serialize işlev ve sonra kullanarak yük CArchive >> işleci.
Bu durumda aşağıdaki örnekte gösterilmiştir:
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
}
}
Özet olarak seri hale getirilebilir Sınıfınızın bir katıştırılmış tanımlıyorsa, CObject üye olarak yapmanız gerekir değil kullanmak CArchive<< ve >> bu nesne için işleçler ancak çağırmalıdır Serialize işlevini yerine. Ayrıca, seri hale getirilebilir sınıfınız için bir işaretçi tanımlıyorsa bir CObject (veya nesneyi türetilen CObject) üyesi, ancak yapıları bu nesne, kendi kurucu, ayrıca çağırmalıdır Serialize.