重命名MFC CArchive序列化类

Jon*_*han 6 c++ mfc

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

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

Mar*_*rst 8

关键点在于,当您使用DECLARE_SERIALand时IMPLEMENT_SERIAL,CRuntimeClass会在您的类中添加一个包含该m_lpszClassName字段名称的成员.此CRuntimeClass对象还会添加到由动态创建类时搜索的框架维护的列表中.您需要确保该CRuntimeClass对象包含您的类的旧名称m_lpszClassName.

你有两个选择:

  1. 覆盖CRuntimeClass对象的构造 以设置名称

  2. m_lpszClassName创建后,更改存储在其字段中的类名

覆盖CRuntimeClass对象的构造

要做到这一点,你需要使自己的版本DECLARE_DYMAMIC,DECLARE_DYNCREATE,DECLARE_SERIAL,IMPLEMENT_DYMAMIC,IMPLEMENT_DYNCREATE,和IMPLEMENT_SERIAL.您只需复制和重命名现有实现即可.在您的版本中IMPLEMENT_DYNAMIC,您需要更改构造CRuntimeClass它的代码,以便使用旧类的名称对其进行初始化.

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

由于它CRuntimeClass是由静态初始化程序创建的,我认为你不能在你的类中做到这一点.我认为最好的地方就是你的应用程序InitInstance.将static char*变量添加到包含旧类名的应用程序类中.然后,在InitInstance,设置m_lpszClassName您班级的字段CRuntimeClass.

  • 第一种方法的优点是可以保持类本身的变化.
  • 第二个使应用程序以可能不应该的方式识别该类.

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