使用不同的成员MFC c ++序列化继承的类

时间:2017-01-26 15:07:37

标签: c++ serialization mfc

我在MFC c ++中构建了一个绘图应用程序。 所有序列化都适用于继承自“Shape”的类。 (如椭圆,圆,矩形)。 这是形状的序列化函数:

    void Shape::Serialize(CArchive& archive)
{
    // call base class function first
    // base class is CObject in this case
    CObject::Serialize(archive);

    // now do the stuff for our specific class
    if (archive.IsStoring())
        archive << start.x << start.y << end.x << end.y << innerColor << outerColor << thick << style;
    else
        archive >> start.x >> start.y >> end.x >> end.y >> innerColor >> outerColor >> thick >> style;

}

这是调用serialize的函数:

    void CPaintDlg::SaveScreen()
{
    CFile file(L"FILE.$$", CFile::modeWrite | CFile::modeCreate);
    CArchive ar(&file, CArchive::store);
    Shapes.Serialize(ar);
}

这是unserialize调用的地方:

    void CPaintDlg::LoadScreen()
{
    try
    {
        CFile file(L"FILE.$$", CFile::modeRead);
        CArchive ar(&file, CArchive::load);
        Shapes.Serialize(ar);
    }
    catch (...)
    {
        AfxMessageBox(_T("Some thing went wrong"));
    }
    InvalidateRect(&rect);
}

我持有CTypedPtrArray<CObArray,Shape *&gt;它调用了Shapes,我从这个数组的每个索引调用Draw func。 我有一个名为FreedDraw的类派生自Shape,它有一个Shape不具有的成员,称为Points。 (包含屏幕上所有自由绘图点的矢量)。

在我宣布的每个班级DECLARE_SERIAL(FreeDraw) 并在cpp文件中IMPLEMENT_SERIAL(FreeDraw, Shape, 1) 我不知道如何序列化和反序列化这个向量以及如何将它与我现有的序列化函数合并。

2 个答案:

答案 0 :(得分:1)

您是否可以先将矢量的存档大小基本放入,然后您可以通过存档对象中具有该大小的循环进行读取?

答案 1 :(得分:0)

你可能需要这样的东西:

编写shapes数组:

archive << (DWORD)shapes.GetCount();  // write number of shapes as DWORD

for (int i = 0; i < shapes.GetCount(); i++)
{
    shapes[i]->Serialize(archive);    // write shape
}

阅读shapes数组:

DWORD count;
archive >> count;                     // read number of shapes

for (int i = 0; i < count; i++)
{
   Shape *pshape = new Shape;
   pshape->Serialize(archive);        // read one shape
   shapes.Add(pshape);                // add pshape to shapes
}

免责声明:这是不完整且未经测试的代码,只是为了让您了解自己需要做什么。