2017-01-26 51 views
0

我已經在MFC C++中構建了一個繪圖應用程序。 所有序列化都適用於從「Shape」繼承的類。 (如橢圓,圓形,矩形)。 這是形狀的系列化FUNC:使用不同成員序列化繼承類MFC C++

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; 

} 

這是調用序列化功能:

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

,這就是反序列化所謂的地方:

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,形狀*>其中調用形狀和即時調用從該數組的每個索引中繪製func。 我有另一個類叫做FreedDraw,它派生自Shape,它有一個Shape不存在的成員,它叫做Points。 (包含屏幕上所有可用繪圖點的向量)。

在每堂課我已經聲明DECLARE_SERIAL(FreeDraw) 和cpp文件IMPLEMENT_SERIAL(FreeDraw, Shape, 1) 我不知道如何序列化和反序列化這個載體,如何與我的存在序列化功能合併。

+0

請顯示更多代碼。 –

+0

增加了更多代碼 – Benny67b

+0

[序列化在MFC](https://msdn.microsoft.com/en-us/library/6bz744w8.aspx)是強制性的閱讀。確保你理解[TN002:Persistent Object Data Format](https://msdn.microsoft.com/en-us/library/32wxt301.aspx)。 – IInspectable

回答

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 
} 

免責聲明:這是不完整的,未經測試的代碼,只是爲了讓你知道你需要做什麼。

1

你可以基本上把矢量的存檔大小放在第一位,然後你可以通過從存檔對象的大小的循環讀取?

+0

但在我的序列化函數向量不被識別,因爲它不是這個類的成員 – Benny67b