技术文档
编程杂记
友情链接
技术文档 >VC++ >
MFC中对象序列化技术的实现
2008-11-18 8:56:01 浏览/评论:1/0
1、需求
对于支持序列化操作的类
可以将不同类的不同对象以序列的形式写到文件中;
可以通过读取序列化文件还原对应类的对应实例;
针对对象的哪些内容进行序列化由对象来决定;
2、需求示例
2.1、需要序列化的对象对应的类
l CName
class CName:public CObject
{
public:
DECLARE_SERIAL(CName)
CName()
{m_d1=0;m_d2=0;};
CName(double d1,double d2)
{m_d1=d1;m_d2=d2;};
void Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring()){ar<<m_d1; ar<<m_d2;}
else {ar>>m_d1;ar>>m_d2;}
};
virtual ~CName(){};
public:
double m_d1;
double m_d2;
};
IMPLEMENT_SERIAL(CName,CObject,0)
l CChildName
class CChildName:public CName
{
public:
DECLARE_SERIAL(CChildName)
CChildName()
{m_i=0; m_c=0;m_d1=0;m_d2=0;};
CChildName(int i,char c,double d1=1.1,double d2=2.2)
{m_i=i;m_c=c;m_d1=d1;m_d2=d2;};
void Serialize(CArchive& ar)
{
CObject::Serialize(ar);
CName::Serialize(ar);
if (ar.IsStoring()){ar<<m_i;ar<<m_c;}
else{ar>>m_i; ar>>m_c; }
}
virtual ~CChildName(){};
public:
int m_i;
char m_c;
};
IMPLEMENT_SERIAL(CChildName,CName,0)
2.2、辅助类
l CObject
所有MFC类的基类
l CObList
存放CObject对象指针的链表
l CFile
进行文件读写操作的类
l CArchive
MFC封装对象序列化功能的核心类
2.3、测试程序
l main函数
void main()
{
testSerialStore();
testSerialLoad();
}
l testSerialStore函数
void testSerialStore()
{
CObList cObList;
CName cName1(1.1,2.2),cName2(2.2,4.4);
CChildName cChildName1(1,'a',1.11,2.22),cChildName2(2,'b',2.22,4.44);
cObList.AddHead(&cName1);
cObList.AddHead(&cChildName1);
cObList.AddHead(&cName2);
cObList.AddHead(&cChildName2);
printf("######Store"n");
printf(" CName[%3.1f,%3.1f]"n",cName1.m_d1,cName1.m_d2);
printf("CChildName[%3.1f,%3.1f,%d,%c]"n",
cChildName1.m_d1,cChildName1.m_d2,cChildName1.m_i,cChildName1.m_c);
printf(" CName[%3.1f,%3.1f]"n",cName2.m_d1,cName2.m_d2);
printf("CChildName[%3.1f,%3.1f,%d,%c]"n",
cChildName2.m_d1,cChildName2.m_d2,cChildName2.m_i,cChildName2.m_c);
CFile m_fileIn("ser.bin", CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive);
CArchive arStore(&m_fileIn,CArchive::store);
cObList.Serialize(arStore);
arStore.Close();
m_fileIn.Close();
}
l testSerialLoad函数
void testSerialLoad()
{
CObList cObList;
CFile m_fileOut("ser.bin", CFile::modeRead| CFile::shareExclusive);
CArchive arLoad(&m_fileOut,CArchive::load);
cObList.Serialize(arLoad);
printf("######Load"n");
CObject *pObject;
POSITION pos = cObList.GetTailPosition();
while (pos != NULL)
{
pObject=cObList.GetPrev(pos);
if(pObject->IsKindOf(RUNTIME_CLASS(CChildName)))
printf("CChildName[%3.1f,%3.1f,%d,%c]"n",
((CChildName*)pObject)->m_d1,((CChildName*)pObject)->m_d2,
((CChildName*)pObject)->m_i,((CChildName*)pObject)->m_c);
else if(pObject->IsKindOf(RUNTIME_CLASS(CName)))
printf(" CName[%3.1f,%3.1f]"n",
((CName*)pObject)->m_d1,((CName*)pObject)->m_d2);
delete pObject;
}
printf(""n");
arLoad.Close();
m_fileOut.Close();
}
l 运行结果
######Store
CName[1.1,2.2]
CChildName[1.1,2.2,1,a]
CName[2.2,4.4]
CChildName[2.2,4.4,2,b]
######Load
CName[1.1,2.2]
CChildName[1.1,2.2,1,a]
CName[2.2,4.4]
CChildName[2.2,4.4,2,b]
3.1、实现一个双向链表容器-CObList
3.2、实现对象序列化的核心功能-CArchive
{
if (m_lpBufCur + sizeof(WORD) > m_lpBufMax)
Flush();//内存->文件
*((WORD*)m_lpBufCur) = w;
m_lpBufCur += sizeof(WORD);
return *this;
};
CArchive& operator>>(WORD& w)//从内存/文件中读出一个WORD变量的值
{
if (m_lpBufCur + sizeof(WORD) > m_lpBufMax)
FillBuffer(sizeof(WORD) - (UINT)(m_lpBufMax - m_lpBufCur)); //文件-> 内存
w = *((WORD*)m_lpBufCur);
m_lpBufCur += sizeof(WORD);
return *this;
};
{
ar.WriteObject(pOb);
return ar;
};
friend CArchive& operator>>(CArchive& ar, CObject*& pOb)
{
pOb = ar.ReadObject(NULL);
return ar;
};
3.3、底层支持功能