2011-03-16 119 views
1

我遇到了VS2010 VC++中的指针数据序列化和反序列化问题。基本上,该程序无法序列化和反序列化CObList *指针数据。源代码执行处理该过程的正常步骤:使用MFC CArchive序列化指针(使用mfc100d.dll,CMemFile)

1)MyObject从CObject继承;

2)我们在类声明(第1行)中添加了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 ::序列化是相应的执行。 CObList * m_pObjectsList;在头文件中正确声明。

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

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

也许MFC100d在64位OS调试器中不适用于W32程序?这在调试模式和发布模式下都会导致问题。发生了什么?我已经耗尽了我的资源,任何方向或灵感都非常感谢。谢谢大家。

+0

你初始化了'm_pObjectsList'吗? – Erik 2011-03-16 19:56:25

+0

这是遗留的遗留代码库。我看到m_pObjectsList = new CObList;在NewObjectsList方法中,并且m_pObjectsList = NULL;在构造函数代码中。 – 2011-03-16 20:01:14

+0

我认为这表示它已初始化。 – 2011-03-16 20:08:30

回答

3

指针不能是序列化

没有保证

  1. 应用程序读取文件 将有机会获得的 存储在同一地区
  2. 操作系统将将数据放在同一 地方
  3. 应用读取文件 将被放置在同一个地方 内存

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

更好的办法是写出全部的数据,并让应用程序读取数据将数据放入内存中。这也使应用程序可以自由地使用任何数据结构来存储数据。

+0

同意 - 您需要序列化列表中的每个对象,而不是指向列表的指针。 – Jeff 2011-03-17 05:39:52

+0

在MFC 6(Visual Studio 6)之前和之前,编译器能够很好地处理这个指针序列化。我认为所有的MFC都是在收紧内存分配安全/策略之后才实现的。 – 2011-03-23 16:32:09

+0

@Jerry:您可以将指针从您的机器存储到文件中。我把文件读到我的机器上。请问指针中的指针或值是否仍然在我的机器上有效?如果我正在运行Windows NT并在Mac上运行,该怎么办?无法保证任何操作系统每次启动时都会将程序加载到完全相同的位置;因此指针的内容可能无效。冒险。 – 2011-03-23 16:49:00