gpt4 book ai didi

c++ - 使用 MFC CArchive 序列化指针(使用 mfc100d.dll、CMemFile)

转载 作者:行者123 更新时间:2023-11-30 02:09:32 26 4
gpt4 key购买 nike

我在 VS2010 VC++ 中序列化和反序列化指针数据时遇到问题。基本上,该程序无法序列化和反序列化 CObList * 指针数据。源代码执行正常步骤来处理该过程:

1) MyObject继承自CObject;

2) 我们在类声明中添加了 DECLARE_SERIAL(MyObject)(第一行);

3) 我们添加了 IMPLEMENT_SERIAL( MyObject, MyParentObject, SCHEMA_VERSION )

//Where MyParentObject is inherited from CObject (indirectly, there're a few more levels of objects), SCHEMA_VERSION is just a version control CONSTANT we use

4) 然后我们重载了

void MyObject::Serialize( CArchive& ar )
{
BOOL b;
.....
... (some other simple variables with default values)

MyParentObject::Serialize(ar);

if (ar.IsStoring())
{
ar << m_sTitle;
ar << m_pObjectsList;
}
else
{
ar >> m_sTitle;
ar >> m_pObjectsList;
}
}

注意:MyParentObject::Serialize 是相应实现的。 CObList * m_pObjectsList;在头文件中正确声明。

当尝试从“ar >> m_pObjectsList”反序列化时,程序抛出访问冲突(MyApp.exe 中 0x52e77b2c (mfc100d.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000004)。

然后我开始测试并将复杂的指针 m_pObjectsList 更改为指向 CString 的简单指针。反序列化指向 CString 的指针时,同时发生相同的错误。如果我简单地通过 CString 序列化和反序列化(没有指针),它工作正常。似乎某些指针序列化已损坏。

也许 MFC100d 在 64 位操作系统调试器中不能很好地与 W32 程序一起工作?这在 Debug模式和 Release模式下都会引起问题。发生了什么?我已经用尽了我的资源,非常感谢任何方向或灵感。先谢谢大家。

最佳答案

指针不能序列化

不能保证

  1. 读取文件的应用程序将可以访问相同的区域内存
  2. 操作系统会将数据放在同一个地点
  3. 读取文件的应用程序将被放置在同一个地方内存

一个想法是通过使用文件偏移来模拟指针。因此,对象位于文件中相对于开头的位置。这是困难的。

更好的想法是写出所有数据,让读取数据的应用程序将数据放在内存中。这也使应用程序可以自由使用它想要存储数据的任何数据结构。

关于c++ - 使用 MFC CArchive 序列化指针(使用 mfc100d.dll、CMemFile),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com