보관을 통해 CObject 저장 및 로드
보관을 통해 S를 CObject
저장하고 로드하려면 추가 고려 사항이 필요합니다. 경우에 따라 개체의 함수를 Serialize
호출해야 합니다. 여기서 CArchive
개체는 호출의 매개 변수이고, 개체의 Serialize
연 >> 산자를 사용하는 << 것이 아니라 호출의 CArchive
매개 변수입니다. 유 CArchive
>> 의해야 할 중요한 사실은 연산자가 저장 보관 파일에 의해 이전에 파일에 기록된 정보를 기반으로 CRuntimeClass
메모리 내를 생성 CObject
한다는 것입니다.
따라서 호출과 >> 연산자를 Serialize
사용하는 CArchive
<< 지 여부는 이전에 저장된 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
해야 합니다.