我需要序列化指向基类和派生类的指针 vector 。 两个类都重载了序列化函数,所以我像这样成功地做到了:`
CFile out;
if (!out.Open(filename.c_str(), CFile::modeWrite | CFile::modeCreate))
return false;
CArchive ar(&out, CArchive::store);
for (auto it = container_.begin(); it != container_.end(); ++it)
{
(*it)->Serialize(ar);
}
ar.Close();
out.Close();
那么问题来了,我现在应该如何反序列化呢?我不知道在从 CArchive 读取对象时调用正确的构造函数...
最佳答案
您首先需要保存容器中元素的数量(使用 ar.WriteCount
)。然后(因为您的容器中有多种类型)对于您序列化的每个元素,您需要包含额外的数据来告诉您该元素的类型。这可能只是一个额外的字符(0 = 基类,1 = 第一个派生类)、另一个计数类型数字(用 WriteCount 编写)或更详细的内容,如类型名称。
要读回它,您读取元素计数(使用 ar.ReadCount
),然后对于每个要读入的元素,您读取类型字符、计数或其他任何类型,分配该类型的新元素,反序列化到新的分配的元素,最后将分配的元素存储到你反序列化的容器中。
多年前我需要做类似的事情,以便从 MFC 容器过渡到 STL 容器,MFC 容器使用的序列化实现(在 <afxtempl.h>
中)非常有帮助。
关于C++ MFC 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33703914/