怎样给串行化类分配版本号(可配置版本模式),怎样给串行化类分配版本号(可配置版本模式)
【 tulaoshi.com - C语言心得技巧 】
怎样给串行化类分配版本号(可配置版本模式)
作者:阿豪(kof)
调用GetObjectSchema时要注意几个规则。首先,只有对象在被并行化时才能调用。其次,必须在读取档案对象数据之前调用。再者,它只能调用一次。如果GetObjectSchema在调用Serialize前后调用两次,则返回-1。我们先看个例子,这是版本1的CLine类:
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)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,从而可能造成严重后果。
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,两个模式实际上是不同的。
void CLine::Serialize (CArchive& ar){ CObject::Serialize (ar); if (ar.IsStoring ()) ar << m_ptFrom << m_ptTo; else // Loading, not storing
来源:http://www.tulaoshi.com/n/20160129/1486087.html
看过《怎样给串行化类分配版本号(可配置版本模式)》的人还看了以下文章 更多>>