сериализация — Visual C ++, CArchive Serialize

Я изучаю Visual C ++ с Visual Studio 2010.
Я пытался использовать функцию сериализации MFC CObject.
Я не могу загрузить свой объект с помощью функции Serialize
Мой код:

#include <afxwin.h>
#include <iostream>

using std::cout;
using std::endl;

// CMyObject

class CMyObject : public CObject
{
public:
int x, y;
CMyObject(int _x=0, int _y=0) : CObject(), x(_x), y(_y) {}
void Serialize(CArchive &ar);
void Print() const;
DECLARE_SERIAL(CMyObject)
};

IMPLEMENT_SERIAL(CMyObject, CObject, 1)

void CMyObject::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
ar << x;
else
ar >> x;
}

void CMyObject::Print() const
{
cout << "CMyObject (" << x << "," << y << ")" << endl;
}int main()
{
CMyObject cm(1,3);
CFile fileS, fileL;
fileS.Open(L"C:\\CMyObject.dat", CFile::modeWrite | CFile::modeCreate);
CArchive arStore(&fileS, CArchive::store);

cm.Print();
cm.Serialize(arStore);
arStore.Close();

cm.x = 2;
cm.Print();

fileL.Open(L"C:\\CMyObject.dat", CFile::modeRead);
CArchive arLoad(&fileL, CArchive::load);
cm.Serialize(arLoad);
cm.Print();
arLoad.Close();
}

Программа умерла на веревке:

    cm.Serialize(arLoad);

Не могли бы вы сказать мне, что не так с этим кодом?

2

Решение

Вы должны проверять звонки Open() за неудачу. Вы забыли закрыть файл после того, как закончили писать в него. добавлять fileS.Close(); после закрытия объекта архива.

if(!fileS.Open(L"C:\\source\\CMyObject.dat", CFile::modeWrite | CFile::modeCreate))
{
std::cout << "Unable to open output file" << std::endl;
return 1;
}
CArchive arStore(&fileS, CArchive::store);
cm.Print();
cm.Serialize(arStore);
arStore.Close();
fileS.Close();  //  <--- close the fileif(!fileL.Open(L"C:\\source\\CMyObject.dat", CFile::modeRead))
{
std::cout << "Unable to open input file" << std::endl;
return 1;
}
CArchive arLoad(&fileL, CArchive::load);
cm.Serialize(arLoad);
cm.Print();
arLoad.Close();
fileL.Close();  //  <--- close the file
0

Другие решения

Чтобы MFC динамически создавал ваш объект во время десериализации, в вашем определении класса должен быть конструктор без параметров. Ссылка:

http://msdn.microsoft.com/en-us/library/47ecfxkh.aspx

0

По вопросам рекламы [email protected]