使用MFC CArchive序列化指针(使用mfc100d.dll,CMemFile)

时间:2011-03-16 19:54:54

标签: c++ visual-studio-2010 visual-c++ mfc

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

1)MyObject继承自CObject;

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

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&gt;&gt;&n; m_pObjectsList”反序列化时,程序在MyApp.exe中引发了访问冲突(第一次机会异常,位于0x52e77b2c(mfc100d.dll):0xC0000005:访问冲突读取位置0x00000004)。 / p>

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

也许MFC100d在64位操作系统调试器中与W32程序不兼容?这在调试模式和释放模式下都会导致问题。发生了什么?我已经耗尽了我的资源,任何方向或灵感都非常感激。谢谢大家。

1 个答案:

答案 0 :(得分:4)

指针不能序列化

无法保证

  1. 读取文件的应用程序 将有权访问相同的区域 存储器
  2. 操作系统会将数据放在同一个数据库中 地方
  3. 读取文件的应用程序 将放在同一个地方 存储器
  4. 一个想法是使用文件偏移来模拟指针。因此,对象位于文件中相对于开头的位置。这是困难的。

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