C++ MFC 序列化

标签 c++ serialization mfc

我需要序列化指向基类和派生类的指针 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/

相关文章:

c++ - CListCtrl 用鼠标选择多行

c++ - Windows共享内存访问时间慢

C++ Do-While 循环不接受多次输入

c++ - 错误 : no match for 'operator+' (operand types are 'std::__cxx11::list<int>' and 'int' )|

c++ - 何时删除缓冲区对象?

python - bytearray 不是 JSON 可序列化的

c++ - CToolbar 是否支持带有 32 位图标的按钮?

c++ - 将 mpfr_t(或任何其他任意精度库类型)转换为 __float128

c# - 使用 Json.Net 的多态 JSON 反序列化失败

java - java中如何在两个JVM之间传递对象?