使用MFC提供的Serialize功能对类型进行序列化/反序列化非常的方便。当软件升级后,Serialize的内容可能也会发生变化,这时,就可以使用MFC提供的版本控制功能解决反序列化因为内容不同引起的冲突了。
编写可序列化类时,MFC用IMPLEMENT_SERIAL宏指定的模式号作为版本控制的依据。反序列化时,MFC将文件中记录的模式号与应用程序中使用的模式号进行对比,如果不匹配,MFC将抛出一个CArchiveException异常,其m_cause等于CArchiveException::badSchema。为了避免产生异常,我们需要在指定新模式号的同时使用VERSIONABLE_SCHEMA标志,如下所示:
IMPLEMENT_SERIAL(XX, XXX, 2 | VERSIONABLE_SCHEMA) //假设升级前的模式号是1
这样,在Serialize函数内就可以通过GetObjectSchema函数获得反序列化文件的模式号了,如下所示:
void XX::Serialize(CArchive& ar)
{
//Call base's Serialize method.
if(ar.IsStoring())
{
//Save value to ar.
}else
{
UINT ver = ar.GetObjectSchema();
switch(ver)
{
case 1:
//Load old version value.
break;