怎样给串行化类分配版本号(可配置版本模式)
2007-03-15 21:55:24 来源:WEB开发网明白了串行化类分配版本号,我们现在看个例子吧: 这是我不久前编的一个程序,只是为了学习MFC而编的,没有什么实际意义,而且网络上有很多这样的程序。编的不好,不要见笑,哈哈^_^自己先笑了。 在squareDoc.h文件中:class CSquareDoc : public CDocument
在squareDoc.cpp文件中:
{
protected: // create from serialization only
CSquareDoc();
DECLARE_SERIAL(CSquareDoc)//注意这句
// Attributes
public:
// Operations
public:
........//省略的部分程序代码,具体看例子
}#include "stdafx.h"
//保存数据
#include "square.h"
#include "squareDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
........//省略部分程序代码,具体看例子
/////////////////////////////////////////////////////////////////////////////
// CSquareDoc
IMPLEMENT_SERIAL(CSquareDoc, CDocument,2|VERSIONABLE_SCHEMA)//注意这句
BEGIN_MESSAGE_MAP(CSquareDoc, CDocument)
//{{AFX_MSG_MAP(CSquareDoc)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
........//省略部分程序代码,具体看例子
void CSquareDoc::Serialize(CArchive& ar)
{
ar.SerializeClass(RUNTIME_CLASS(CSquareDoc));
CDocument::Serialize(ar);
if (ar.IsStoring()) //保存数据
{
SaveData(ar); //只按最新版本存储
}
else //提取数据
{
UINT nSchema=ar.GetObjectSchema();
switch(nSchema)
{
case 1: LoadDataV1(ar);break;//版本1
case 2: LoadDataV2(ar);break;//版本2
default:AfxThrowArchiveException(CArchiveException::badSchema);
break;
}
}
}void CSquareDoc::SaveData(CArchive &ar)
结束语
{
//保存变量
ar<<iSpeed<<fenshu<<iBomb<<iMissile<<iA_bomb;
//保存地图数据
for(int i=0;i<SQUARE_AMOUNT_y;i++)
{
for(int j=0;j<SQUARE_AMOUNT_x;j++)
{
ar<<mc[j][i].CellPos.x<<mc[j][i].CellPos.y
<<mc[j][i].IsFillFlag<<mc[j][i].rgb
<<mc[j][i].size.cx<<mc[j][i].size.cy;
}
}
//保存方块数据
ar<<sq.rgb<<sq.type;
for(i=0;i<4;i++)
{
ar<<sq.ps[i].x<<sq.ps[i].y;
}
//保存预知方块数据
ar<<PreSq.rgb<<PreSq.type;
for(i=0;i<4;i++)
{
ar<<PreSq.ps[i].x<<PreSq.ps[i].y;
}
}
//提取版本1的数据
void CSquareDoc::LoadDataV1(CArchive &ar)
{
//提取变量
ar>>iSpeed>>fenshu;
//版本1中没有炸弹、导弹和原子弹
iBomb=0;iMissile=0;iA_bomb=0;
//提取地图数据(版本1中是单色)
for(int i=0;i<SQUARE_AMOUNT_y;i++)
{
for(int j=0;j<SQUARE_AMOUNT_x;j++)
{
ar>>mc[j][i].CellPos.x>>mc[j][i].CellPos.y
>>mc[j][i].IsFillFlag>>mc[j][i].size.cx
>>mc[j][i].size.cy;
mc[j][i].rgb=RGB(0,255,0);
}
}
//提取方块数据(版本1中是单色)
ar>>sq.type;
sq.rgb=RGB(0,255,0);
for(i=0;i<4;i++)
{
ar>>sq.ps[i].x>>sq.ps[i].y;
}
//提取预知方块数据(版本1中是单色)
ar>>PreSq.type;
PreSq.rgb=RGB(0,255,0);
for(i=0;i<4;i++)
{
ar>>PreSq.ps[i].x>>PreSq.ps[i].y;
}
}
//版本2
void CSquareDoc::LoadDataV2(CArchive &ar)
{
//提取变量
ar>>iSpeed>>fenshu>>iBomb>>iMissile>>iA_bomb;
//提取地图数据
for(int i=0;i<SQUARE_AMOUNT_y;i++)
{
for(int j=0;j<SQUARE_AMOUNT_x;j++)
{
ar>>mc[j][i].CellPos.x>>mc[j][i].CellPos.y
>>mc[j][i].IsFillFlag>>mc[j][i].rgb
>>mc[j][i].size.cx>>mc[j][i].size.cy;
}
}
//提取方块数据
ar>>sq.rgb>>sq.type;
for(i=0;i<4;i++)
{
ar>>sq.ps[i].x>>sq.ps[i].y;
}
//提取预知方块数据
ar>>PreSq.rgb>>PreSq.type;
for(i=0;i<4;i++)
{
ar>>PreSq.ps[i].x>>PreSq.ps[i].y;
}
}
........//省略部分程序代码,具体看例子。
你现在应该知道怎么配置版本模式了吧,是不是很简单阿!本程序在WinXP和VC++6.0下编译通过。其实这个例子中还有很多地方值的参考,你可要仔细看看,在这里我就不多说了,有什么问题欢迎提出,大家可以讨论讨论。再次声明,本程序只是为了学习MFC的朋友使用,可以随意复制,修改,我想这种程序不会有人作为商业目的吧。有不同意见和问题的朋友,欢迎提出,谢谢!!!
更多精彩
赞助商链接