最近看msdn自己练习了一下序列化,出现如下问题:
自己建了一个类:继承于cobject,包括 CString m_title;   CString m_content;
   CTime m_time;三个成员变量。
一个构造函数:
CMyevent::CMyevent()
{       
       m_title="nothing";
       m_content="nothing";
       m_time=CTime::GetCurrentTime();
}
一个序列化函数:
void CMyevent::Serialize(CArchive& ar)
{
 CObject::Serialize(ar);
     
      
if (ar.IsStoring()) {
ar<<m_title<<m_content<<m_time;
}
else {
            ar>>m_title>>m_content>>m_time;

}
}
我在文档类的构造函数中进行如下操作:
(m_obarray是一个文档类的中定义的CObArray类的对象)
m_obarray.Add(new CMyevent());
      char* pszFileName = "c:\\file.txt";
 
      CFile myFile;
      CFileException fileException;     if ( !myFile.Open( pszFileName, CFile::modeCreate |   
          CFile::modeReadWrite, &fileException ) )
 {
    TRACE( "Can't open file %s, error = %u\n",
       pszFileName, fileException.m_cause );
 }
    
  CArchive arstore(&myFile,CArchive::store);
      m_obarray.Serialize(arstore);
      arstore.Close();
  myFile.Close();
    if ( !myFile.Open( pszFileName, CFile::modeCreate |   
          CFile::modeReadWrite, &fileException ) )
 {
    TRACE( "Can't open file %s, error = %u\n",
       pszFileName, fileException.m_cause );
 }
    
    CArchive arload(&myFile,CArchive::load);
    m_obarray.Serialize(arload);
    arload.Close();
    myFile.Close();
按ctrl+F5后出现提示:建立空文档失败,将m_obarray.Serialize(arload);去掉后就没事了,这就是说问题出在这里??
请问:出错的原因是因为CMyevent类的序列化函数出错还是因为CObArray类的错误??
我实在是搞不出来了,请大家指点指点

解决方案 »

  1.   

    我感觉应该是CObArray里的错误
    CMyevent里很正常
      

  2.   

    CArchive arstore(&myFile,CArchive::store);
          m_obarray.Serialize(arstore);
          arstore.Close();
      myFile.Close();
        if ( !myFile.Open( pszFileName, CFile::modeCreate |   
              CFile::modeReadWrite, &fileException ) )
     {
        TRACE( "Can't open file %s, error = %u\n",
           pszFileName, fileException.m_cause );
     }
        
        CArchive arload(&myFile,CArchive::load);
        m_obarray.Serialize(arload);
        arload.Close();
        --------------------------------------->我给一点伪代码int size = 0;if (ar.IsStoring()) {
    size = m_obarray.size();
    ar<< size;
    for(int i=0;i<size;i++)
    {
    m_obarray.Serialize(ar);
    }
    }else
    {
    ar>> size;
    m_obarray.setsize(size);
    m_obarray.Serialize(ar);}
      

  3.   

    wwwllg(wwwllg)的意思是不是让我这样做:
    m_obarray.Add(new CMyevent());
          char* pszFileName = "c:\\file.txt";
     
          CFile myFile;
          CFileException fileException;     if ( !myFile.Open( pszFileName, CFile::modeCreate |   
              CFile::modeReadWrite, &fileException ) )
     {
        TRACE( "Can't open file %s, error = %u\n",
           pszFileName, fileException.m_cause );
     }
          int sizestore = 0;   CArchive arstore(&myFile,CArchive::store);
          sizestore = m_obarray.GetSize();
          arstore<<sizestore;
      for(int i=0;i<sizestore;i++){
          m_obarray.Serialize(arstore);
      }
          arstore.Close();
      myFile.Close();
        if ( !myFile.Open( pszFileName, CFile::modeCreate |   
              CFile::modeReadWrite, &fileException ) )
     {
        TRACE( "Can't open file %s, error = %u\n",
           pszFileName, fileException.m_cause );
     }
        
        CArchive arload(&myFile,CArchive::load);
    int sizeload;
    arload>>sizeload;
        m_obarray.SetSize(sizeload);
        m_obarray.Serialize(arload);    arload.Close();
        myFile.Close();
    但还是提示:建立空文档失败阿
    我理解得不对吗??
      

  4.   

    总感觉CTime类的对象有点不大对,它没有从object类继承,而且它的序列化函数是Serialize64(),是不是需要对它进行别的处理??
      

  5.   

    你还是错了。你那样存是乱的。应这样存,
    首先存对象个数,然后根据个数,一个对象一个对象的存,不要调用m_obarray.Serialize(arload);
    而是,每次取多一个m_obarray中的一个元素存,m_obarray[i].Serialize(ar);注意是[i].读的时候,先读出个数size,然后,分m_obarray分配size。如果不分配size,则需要new 一个object就addnew,如果先分配size了,就只接用m_obarray[i] = new CMyevent();一定要记住m_obarray只一个对象指针数组,本身不能存信息。而要通过对象指针数组保存new出来的对象new CMyevent();再用这个对象来Serialize我们前面保存的文件。
    我给一点代码,好好体会。
    ---------------------------->
    int count = 0;
    if (ar.IsStoring())
    { // storing code
    count = m_iconWnds.GetCount();
    POSITION pos = m_iconWnds.GetHeadPosition();
    ar<<count;
    for(int i=0;i<count;i++)
    {
    CIconWnd* pItem = (CIconWnd*)m_iconWnds.GetNext(pos);
    pItem->Serialize(ar); }
    }
    else
    {

    ar>>count;
    if(count == 0) return;
    for(int i=0;i<count;i++)
    {
    ICONWNDINFO info;
    info.reset();
    info.Serialize(ar);

    AddIconWnd(&info); }
    }