重命名MFC CArchive序列化类

时间:2010-11-05 14:56:17

标签: c++ mfc

我正在使用MFC的CArhive类来保存我的应用程序的项目文件。其中一个类名称非常不准确,我想更改它,但只是更改名称到处都会使以前的存档文件无法处理存档错误。有没有办法更改已归档类的名称而不会使以前保存的所有文件无效?

当然,没有使用typedef来访问具有新名称的现有类,或者保留具有旧名称的类的版本以读取存档文件并将读入的对象复制到具有新名称的同一类中

2 个答案:

答案 0 :(得分:8)

关键是,当您使用DECLARE_SERIALIMPLEMENT_SERIAL时,CRuntimeClass成员会添加到您的m_lpszClassName字段中包含该名称的类中。 此CRuntimeClass对象也会添加到由动态创建类时搜索的框架维护的列表中。 您需要确保CRuntimeClass对象在m_lpszClassName中包含您班级的旧名称。

你有两个选择:

  1. 覆盖建筑物 CRuntimeClass对象设置名称

  2. 更改存储在其中的班级名称     m_lpszClassName之后的字段     已创建

  3. 覆盖CRuntimeClass对象的构造

    要执行此操作,您需要制作自己的DECLARE_DYMAMICDECLARE_DYNCREATEDECLARE_SERIALIMPLEMENT_DYMAMICIMPLEMENT_DYNCREATE和{{1}版本}}。 您只需复制和重命名现有实现即可。 在您的IMPLEMENT_SERIAL版本中,您需要更改构造IMPLEMENT_DYNAMIC的代码,以便使用旧类的名称对其进行初始化。

    在创建CRuntimeClass对象后更改存储在m_lpszClassName字段中的类名

    由于CRuntimeClass是由静态初始值设定项创建的,因此我认为您不能在类中执行此操作。 我认为最好的地方是你的应用程序CRuntimeClass。 将InitInstance变量添加到包含旧类名的应用程序类中。 然后,在static char*中,在班级InitInstance中设置m_lpszClassName字段。

    • 第一种方法的优点是 保持班级内的变化 本身。
    • 第二个提出申请 以某种方式意识到这个阶级 可能不应该。

    无论哪种方式,首先要做的是完全熟悉动态创建和序列化工作的方式。

答案 1 :(得分:0)

我选了第3个选项。我最初命名了一个可序列化的类CEvent,这在VC6.0上似乎没有问题;但在VS2010上有一个名为CEvent的MFC内置类,所以我不得不改变它。

所以,我在调用COleServerDoc::OnOpenDocument

之前通过修改旧的格式文件来修复它

我只是,打开,读取内存,找到并替换CEvent与任何其他6个字符(必须大小相同)的类名,写入并保存为新文件名,然后打开并读取新文件,否问题

无论如何,我正在更改新版本的文件扩展名,所以一切顺利。