怎样给串行化类分配版本号(可配置版本模式)
2007-03-15 21:55:24 来源:WEB开发网现在工作只做到一半。最后一步是修改CLine::Serialize,使它根据GetObjectSchema不同的返回值并行化CLine。原Serialize函数如下:void CLine::Serialize (CArchive& ar)
新函数如下:
{
CObject::Serialize (ar);
if (ar.IsStoring ())
ar << m_ptFrom << m_ptTo;
else // Loading, not storing
ar >> m_ptFrom >> m_ptTo;
}void CLine::Serialize (CArchive& ar)
明白它是怎样工作的吗?CLine对象写到档案上时,它的格式总是CLine的第2个版本。但是读取 CLine时,根据GetObjectSchema返回值的不同,它又被当做CLine版本1或版本2读回。如果模式号为1,则对象按老方式读取,并把m_clrLine设置为默认值。如果模式号为2,则对象所以数据成员,包括 m_clrLine,都要从档案中读取出来。其他模式号会导致CArchiveException,表示不能识别版本号(如果发生异常,可能是因为程序错了或档案坏了。)如果将来还要修改CLine,则要把模式号增加到3并给新模式添加一个case程序段。
{
CObject::Serialize (ar);
if (ar.IsStoring ())
ar << m_ptFrom << m_ptTo << m_clrLine;
else {
UINT nSchema = ar.GetObjectSchema ();
switch (nSchema) {
case 1: // Version 1 CLine
ar >> m_ptFrom >> m_ptTo;
m_clrLine = RGB (0, 0, 0); // Default color
break;
case 2: // Version 2 CLine
ar >> m_ptFrom >> m_ptTo >> m_clrLine;
break;
default: // Unknown version
AfxThrowArchiveException (CArchiveException::badSchema);
break;
}
}
}
更多精彩
赞助商链接