首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual C++、CArchive序列化

Visual C++、CArchive序列化
EN

Stack Overflow用户
提问于 2013-05-22 11:02:47
回答 2查看 5.4K关注 0票数 2

我使用Visual Studio2010学习Visual C++。我尝试使用MFC CObject的序列化函数。我不能用序列化函数加载我的对象我的代码:

代码语言:javascript
复制
#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();
}

程序在字符串上终止:

代码语言:javascript
复制
    cm.Serialize(arLoad);

你能告诉我这段代码出了什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 11:10:23

您应该检查对Open()的调用是否失败。在完成写入后,您忘记关闭该文件。关闭存档对象后添加fileS.Close();

代码语言:javascript
复制
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 file


if(!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
EN

Stack Overflow用户

发布于 2013-05-22 11:14:35

为了让MFC在反序列化期间动态创建对象,您的类定义必须提供不带参数的构造函数。参考资料:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16682804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档