我有Application 向导产生一个单文档的的mfc程序,void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
for(int i=1;i<=2;i++)
{
int nn=GetGraphUpperBound(i)+1;
while(nn--){
if(GetGraph(i,nn)->IsDelete()){
delete GetGraph(i,nn);
DeleteGraph(i,nn);
}
}
}
m_LineArray.Serialize(ar);
m_CircleArray.Serialize(ar);
}
else
{
// TODO: add loading code here
m_LineArray.Serialize(ar);
m_CircleArray.Serialize(ar);
}
}
其中m_LineArray 为CTypedPtrArray<CObArray,CLine*> m_LineArray;CLine也实现了Serialize(CArchive &ar);是不是要指定一个文件才能保存m_LineArray 中的东西啊????
{
if (ar.IsStoring())
{
// TODO: add storing code here
for(int i=1;i<=2;i++)
{
int nn=GetGraphUpperBound(i)+1;
while(nn--){
if(GetGraph(i,nn)->IsDelete()){
delete GetGraph(i,nn);
DeleteGraph(i,nn);
}
}
}
m_LineArray.Serialize(ar);
m_CircleArray.Serialize(ar);
}
else
{
// TODO: add loading code here
m_LineArray.Serialize(ar);
m_CircleArray.Serialize(ar);
}
}
其中m_LineArray 为CTypedPtrArray<CObArray,CLine*> m_LineArray;CLine也实现了Serialize(CArchive &ar);是不是要指定一个文件才能保存m_LineArray 中的东西啊????
当然你也可以避开这两个消息响应函数,而可以直接构造CArchive类,再调用CDocument()类的?Serialize(CArchive& ar)函数将数据保存至文件中,CArchive类构造示例如下:
char *pFileName = "d:\\test\\test.bmp";
CFile f;
char buf[512];
if (!f.Open(pFileName, cFile::modeCreate|CFile::modeRead|CFile::modeWrite)
{
AfxMessageBox("Unable to open file");
return;
}
CArchive ar(&f, CArchive::store, 512, buf);
....
将这个ar作为参数调用Serialize(CArchive& ar)
{
m_arrayHeadInfo.Serialize(ar);
if (ar.IsStoring())
{
ar << m_dwListCtrlExStyles;
ar << m_dwListCtrlExStylesEx;
}
else
{
ar >> m_dwListCtrlExStyles;
ar >> m_dwListCtrlExStylesEx;
}
}上面是我原来的一个代码,
可以编译,链接成功,但是运行就不正常了
其中arrayHeadInfo的来源定义如下:
typedef CArray<CListCtrlHeadInfo, CListCtrlHeadInfo&> CListCtrlHeadInfoArray;
CListCtrlHeadInfoArray m_arrayHeadInfo;CListCtrlHeadInfo的序列化也有其实现函数 :
void CListCtrlHeadInfo::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_strHead;
ar << m_iHeadWidth;
}
else
{
ar >> m_strHead;
ar >> m_iHeadWidth;
}
}
简单讲,
就是当我要保存序列时候,明明 m_arrayHeadInfo.Serialize(ar); 中的ar.IsStoring() = true的,
结果在跟踪到CArray中,发现 ar.IsStoring() = true不成立了.很奇怪,
然后更改代码如下:
void CListViewInfo::Serialize(CArchive& ar)
{
//m_arrayHeadInfo.Serialize(ar);
if (ar.IsStoring())
{
ar << m_dwListCtrlExStyles;
ar << m_dwListCtrlExStylesEx; INT_PTR iSize = m_arrayHeadInfo.GetCount();
ar << iSize;
for(int i = 0; i < iSize; i++)
{
CListCtrlHeadInfo& Info = m_arrayHeadInfo.GetAt(i);
ar << Info.m_strHead;
ar << Info.m_iHeadWidth;
}
}
else
{
m_arrayHeadInfo.RemoveAll(); ar >> m_dwListCtrlExStyles;
ar >> m_dwListCtrlExStylesEx; INT_PTR iSize;
ar >> iSize;
for(int i = 0; i < iSize; i++)
{
CListCtrlHeadInfo Info;
ar >> Info.m_strHead;
ar >> Info.m_iHeadWidth; m_arrayHeadInfo.Add(Info);
}
}
}也就是说,手工重新实现了m_arrayHeadInfo.Serialize(ar);
虽然很笨拙,但是却可以运行了,
现在为止,运行正常.
上面提到的例子和楼主好像有点类似,
楼主参考下吧,
本人也是VC新人,所以也无法近一步分析了.
======================================
可能问题出来这里(我的上述例子中就是这样)调试时候,跟踪到CTypedPtrArray的序列化程序中,
看看你的 ar 是不是不正确然后把
m_LineArray.Serialize(ar);
m_CircleArray.Serialize(ar);
实现代码搬到你的例码中看看.