本文共 1942 字,大约阅读时间需要 6 分钟。
让MFC中Object的版本号起作用的注意事项
黄国强 2010-4-13 下面这段代码取自MSDN: IMPLEMENT_SERIAL(CMyObject, CObject, VERSIONABLE_SCHEMA|1) void CMyObject::Serialize(CArchive& ar) { if (ar.IsLoading()) { int nVersion = ar.GetObjectSchema(); switch(nVersion) { case 0: // read in previous version of // this object break; case 1: // read in current version of // this object break; default: // report unknown version of // this object break; } } else { // Normal storing code goes here } } 上面的MSDN代码本身并没有问题,但是使用起来,有可能ar.GetObjectSchema()不能获得正确的版本 号。 下面先写一个错误的代码示例 // 将aObj保存到文件中,这段代码的版本号未保存。 CMyObject aObj; CFile f("c://temp//test.dat",CFile::modeCreate|CFile::modeWrite); CArchive ar(&f,CArchive::store); aObj.Serialize(ar);// 此处版本号未保存 有两种方法可以解决这个问题:1) 使用CObArray
示例: CObArray aObArray; CMyObject aObj; obArray.Add(&aObj); CFile f("c://temp//test.dat"); CArchive ar(&f,CArchive::store); aObArray.Serialize(ar);// 此处保存了正确的版本号 2) 使用 CArchive::SerializeClass(const CRuntimeClass* pClassRef) 示例: CMyObject aObj; CFile f("c://temp//test.dat",CFile::modeCreate|CFile::modeWrite); CArchive ar(&f,CArchive::store); // 必须加上此行 ar.SerializeClass(RUNTIME_CLASS(CMyObject)); aObj.Serialize(ar);// 此处保存了正确的版本号
附:另一个比较复杂的示例
class CBase : public CObject { public: CBase(void){} ~CBase(void){} void Serialize( CArchive& ar ); DECLARE_SERIAL(CBase) }; IMPLEMENT_SERIAL( CBase, CObject, VERSIONABLE_SCHEMA | 2 ) void CBase::Serialize(CArchive& ar ) { ar.SerializeClass(RUNTIME_CLASS(CBase)); if(ar.IsLoading()) { int nVersion = ar.GetObjectSchema(); TRACE1("CBase V %i/n",nVersion); } } class CDerived : public CBase { public: CDerived(void){} ~CDerived(void){} void Serialize( CArchive& ar ); DECLARE_SERIAL(CDerived) }; IMPLEMENT_SERIAL( CDerived, CBase, VERSIONABLE_SCHEMA | 10 ) void CDerived::Serialize(CArchive& ar) { CBase::Serialize(ar); ar.SerializeClass(RUNTIME_CLASS(CDerived)); if (ar.IsLoading()) { int nVersion = ar.GetObjectSchema(); TRACE1("CDerived V %i/n",nVersion); } }转载地址:http://zlefb.baihongyu.com/