怎样给串行化类分配版本号(可配置版本模式)
2007-03-15 21:55:24 来源:WEB开发网class CLine : public CObject
{
DECLARE_SERIAL (CLine)
protected:
CPoint m_ptFrom;
CPoint m_ptTo;
public:
CLine () {} // Required!
CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
void Serialize (CArchive& ar);
};
这是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;
}
在实现类的过程中出现的语句:IMPLEMENT_SERIAL (CLine, CObject, 1)
这个类就可以串行化了。目前版本号为1,如果后来又给CLine添加了一个持久性数据成员,则要把版本号增加到2,这样主结构就能根据程序的不同版本区别串行化到磁盘的CLine对象了。否则,磁盘上的版本为1的CLine就可能被读入内存中版本为2的CLine,从而可能造成严重后果。假定在应用程序的第2版本中,你要修改CLine类,想添加一个成员变量,用来保存线的颜色。下面是修改后的类的声明:class CLine : public CObject
因为线的颜色是持久属性(也就是说,保存到档案中的红线在读出时依旧是红的。),所以你向修改 CLine::Serialize,使它在串行化m_ptFrom和m_ptTo之外还能串行化m_clrLine。这意味着要把CLine 的模式号增加到2。使用原类时按以下方式调用MFC的IMPLEMENT_SERIAL宏:
{
DECLARE_SERIAL (CLine)
protected:
CPoint m_ptFrom;
CPoint m_ptTo;
COLORREF m_clrLine; // Line color (new in version 2)
public:
CLine () {}
CLine (CPoint from, CPoint to, COLORREF color)
{ m_ptFrom = from; m_ptTo = to; m_clrLine = color }
void Serialize (CArchive& ar);
}; IMPLEMENT_SERIAL(CLine,CObject,1)
但是在修改后的类中,应该这样调用IMPLEMENT_SERIAL: IMPLEMENT_SERIAL(CLine,CObject,2|VERSIONABLE_SCHEMA)
更新后的程序在读取CLine对象时,如果对象的模式号是1,MFC也不会发送CArchive异常,因为模式号中有VERSIONABLE_SCHEMA标志。但是它会了解到:由于模式号从1变为2,两个模式实际上是不同的。
更多精彩
赞助商链接