Bir Arşiv Kullanarak CObject'leri Depolama ve Yükleme
Bir arşiv aracılığıyla depolamak ve yüklemek CObject
için ek dikkate alınması gerekir. Bazı durumlarda, nesnesinin Serialize
işlevini çağırmanız gerekir; burada CArchive
nesnesi, veya >> işlecini kullanmak << yerine çağrısının CArchive
bir parametresidirSerialize
. Aklınızda bulundurmanız gereken önemli gerçek, işlecin depolama arşivi tarafından dosyaya daha önce yazılan bilgilere göre bellekte oluşturmasıdırCArchive
CObject
>>.CRuntimeClass
Bu nedenle, ve >> işleçlerini kullanıp kullanmamanıza<< CArchive
ve çağrısı Serialize
yapmanız, daha önce depolanan CRuntimeClass
bilgilere göre nesneyi dinamik olarak yeniden yapılandırmak için yükleme arşivine ihtiyacınız olup olmadığına bağlıdır. Serialize
aşağıdaki durumlarda işlevini kullanın:
Nesneyi seri durumdan çıkarırken, nesnenin tam sınıfını önceden bilirsiniz.
Nesneyi seri durumdan çıkarırken, zaten bu nesne için ayrılmış belleğiniz vardır.
Dikkat
nesnesini işlevini kullanarak Serialize
yüklerseniz, nesnesini işlevini kullanarak Serialize
da depolamanız gerekir. işlecini kullanarak depolamayın CArchive
<< ve işlevi kullanarak yüklemeyin Serialize
veya işlevi kullanarak depolayıp işleci kullanarak CArchive >>
yüklemeyinSerialize
.
Aşağıdaki örnekte servis talepleri gösterilmektedir:
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
}
}
Özetle, seri hale getirilebilir sınıfınız katıştırılmış CObject
bir üye olarak tanımlıyorsa, bu nesne için ve >> işleçlerini kullanmamalısınız<<CArchive
, bunun yerine işlevini çağırmalısınız.Serialize
Ayrıca, seri hale getirilebilir sınıfınız bir üye olarak bir CObject
işaretçi (veya öğesinden CObject
türetilmiş bir nesne) tanımlarsa, ancak bu diğer nesneyi kendi oluşturucusunda oluşturursa, öğesini de çağırmalısınız Serialize
.