2017-01-26 11 views
0

私はMFCのC++でペイントアプリケーションを構築しました。 "Shape"を継承するクラスのすべてのシリアライゼーションが機能します。 (楕円、円、長方形)。これは、直列化呼び出す関数である異なるメンバで継承したクラスをシリアル化する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; 

} 

: これは、形状の直列化FUNCある

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); 
} 

イム保持a CTypedPtrArray<CObArray、Shape *>はShapesを呼び出し、imはこの配列のすべてのインデックスから関数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

は、おそらくこのようなものが必要

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 
} 

免責事項:これはちょうどに、不完全かつ未テストコードです

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配列を読みますあなたに何をする必要があるかのアイデアを伝えてください。

1

まず、ベクトルのアーカイブサイズを基本的に入れてから、そのサイズのアーカイブオブジェクトからループを読み取ることができますか?

があなたのshapes配列の書き方:

+0

しかし、私のserialize関数では、このクラスのメンバではないため、ベクトルは認識されません – Benny67b

関連する問題