我有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 中的东西啊????

解决方案 »

  1.   

    是哪,MFC的文档-视图结构响应了ID_FILE_SAVE(保存文档),ID_FILE_SAVE_AS(另存文档)均弹出了文件对话框并要指定文件名。
    当然你也可以避开这两个消息响应函数,而可以直接构造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)
      

  2.   

    void CListViewInfo::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;
    }
    }
      

  3.   

    后来经过调试跟踪,发现 m_arrayHeadInfo.Serialize(ar); 这个语句执行很有问题,
    简单讲,
    就是当我要保存序列时候,明明  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新人,所以也无法近一步分析了.
      

  4.   

    其中m_LineArray 为CTypedPtrArray<CObArray,CLine*> m_LineArray;CLine也实现了Serialize(CArchive &ar);
    ======================================
    可能问题出来这里(我的上述例子中就是这样)调试时候,跟踪到CTypedPtrArray的序列化程序中,
    看看你的 ar 是不是不正确然后把
    m_LineArray.Serialize(ar);
    m_CircleArray.Serialize(ar);
    实现代码搬到你的例码中看看.
      

  5.   

    自己在OnOpenDocument里和OnSaveDocument里写吧
      

  6.   

    m_arrayHeadInfo.Serialize(ar);是调用m_arrayHeadInfo数组的序列化,而该数组的序列化未实现调用数组内的对象的序列化。用个循环依次调调各个数组内各元素对象的序列化试试