WEB开发网
开发学院软件开发VC 怎样给串行化类分配版本号(可配置版本模式) 阅读

怎样给串行化类分配版本号(可配置版本模式)

 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, CPo
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
{
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);
};
  因为线的颜色是持久属性(也就是说,保存到档案中的红线在读出时依旧是红的。),所以你向修改 CLine::Serialize,使它在串行化m_ptFrom和m_ptTo之外还能串行化m_clrLine。这意味着要把CLine 的模式号增加到2。使用原类时按以下方式调用MFC的IMPLEMENT_SERIAL宏:  IMPLEMENT_SERIAL(CLine,CObject,1)但是在修改后的类中,应该这样调用IMPLEMENT_SERIAL:  IMPLEMENT_SERIAL(CLine,CObject,2|VERSIONABLE_SCHEMA)  更新后的程序在读取CLine对象时,如果对象的模式号是1,MFC也不会发送CArchive异常,因为模式号中有VERSIONABLE_SCHEMA标志。但是它会了解到:由于模式号从1变为2,两个模式实际上是不同的。

上一页  1 2 3 4  下一页

Tags:怎样 串行 分配

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接