Aracılığıyla paylaş


Bir Arşiv Kullanarak CObject'leri Depolama ve Yükleme

Bir arşiv aracılığıyla depolamak ve yüklemek CObjectiç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 CArchivebir 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ırCArchiveCObject>>.CRuntimeClass

Bu nedenle, ve >> işleçlerini kullanıp kullanmamanıza<< CArchiveve çağrısı Serializeyapmanı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 CObjecttüretilmiş bir nesne) tanımlarsa, ancak bu diğer nesneyi kendi oluşturucusunda oluşturursa, öğesini de çağırmalısınız Serialize.

Ayrıca bkz.

Seri hale getirme: Bir Nesneyi Seri Hale Getirme