다음을 통해 공유


아카이브를 통해 CObject 저장 및 로드

아카이브를 통해 CObjects를 저장하고 로드하려면 추가적인 고려 사항이 필요합니다. 경우에 따라 Serialize 객체의 CArchive 함수를 호출해야 하며, 이때 Serialize 객체는 CArchive 호출의 매개변수로 사용됩니다. 이는 >> 연산자나 개체 CArchive의 연산자를 사용하는 대신입니다. 기억해야 할 중요한 사실은 CArchive>> 연산자가 저장 보관 파일에 의해 이전에 파일에 기록된 CObject 정보를 기반으로 메모리 내에서 CRuntimeClass를 구성한다는 것입니다.

따라서 CArchive<<>> 연산자를 사용할지, 아니면 Serialize를 호출할지는, 로드 보관이 이전에 저장된 정보를 기반으로 개체를 동적으로 재구성하는 것이 CRuntimeClass지에 따라 결정됩니다. Serialize 다음 경우에 함수를 사용합니다.

  • 개체를 역직렬화할 때 개체의 정확한 클래스를 미리 알 수 있습니다.

  • 객체를 역직렬화할 때는 이미 객체를 위한 메모리가 할당되어 있습니다.

주의

Serialize 함수를 사용하여 개체를 로드하면 Serialize 함수를 사용하여 개체도 저장해야 합니다. CArchive << 연산자를 사용하여 저장한 후 Serialize 함수를 사용하여 로드하거나, Serialize 함수를 사용하여 저장한 후 CArchive >> 연산자를 사용하여 로드하지 마세요.

다음 예제에서는 사례를 보여 줍니다.

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
   }
}

요약하자면, serializable 클래스가 포함된 CObject 멤버를 정의하는 경우 해당 개체에 CArchive 대한 연산자와 << 연산자를 사용하지 >> 대신 함수를 Serialize 호출해야 합니다. 또한, 만약 serialize할 수 있는 클래스가 멤버로서 CObject (또는 CObject에서 파생된 개체)에 대한 포인터를 정의하면서 해당 개체를 자신의 생성자에서 생성하는 경우, Serialize도 호출해야 합니다.

참고하십시오

Serialization: 개체를 직렬화하기