c – 重命名MFC CArchive序列化类

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

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

解决方法

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

你有两个选择:

>覆盖建设
CRuntimeClass对象设置名称
>更改存储在其中的班级名称
m_lpszClassName字段后有
已创建

覆盖CRuntimeClass对象的构造

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

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

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

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

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...