大家好:  上有个序列化的例子,这段代码有些不理解:
if (pArchive->IsStoring()) {
          (*pArchive) << Point::m_strSignature;
          (*pArchive) << Point::m_nVersion;
      } else {
          CString strSignature;   <--------------声明了一个新的CString
          (*pArchive) >> strSignature;<----pArchive是把谁写到strSigna上?
          if (strSignature != Point::m_strSignature)
             return (Status::InvalidFormat);
          (*pArchive) >> nVersion;
          if (nVersion > Point::m_nVersion;)
             return (Status::UnsupportedVersion);
      }不理解的就是 “(*pArchive) >> strSignature” pArchive是把所有的储存在磁盘上的该文件的所有 string都写道strSignature中吗?应该不是吧,因为如果还有一个版本标记和一个文件的名字这两个字符串的话,我怎样分别吧他们读出来呢?难道name,strSignature,version这三个字符串都读到strSignature这一个CString中吗?我的问题就是说我怎样把希望的字符串读到 指定的CString中?就像这样:
*pArchive>>version; <-----得到版本
*pArchive>>name;    <-----得到文件名
*pArchive>>strSignature <----得到标示MFC的这个pArchive怎麽知道 这三个字符串代表的是谁呢?请指点!

解决方案 »

  1.   

    这个程序的功能大致是这样的:
    Point::m_strSignature 是Point类的标志
    Point::m_nVersion     是Point类的版本
    程序只是把这两个内容写入到文件中
    读取的时候也是按照写入的顺序依次从文件中读入,然后比较类标志,是Point类再读取版本号,如果文件中类的版本号比当前的新,就置状态更新。
    置于你说的name文件中根本就没有
      

  2.   

    这个关键要看CString是如何重载>>操作符的。
      

  3.   

    他写的这些 譬如 version,strSignature ,这些都是“文件头“ 信息吧,如果写入文本内容呢? 比如一段中文字,也和他们一起序列化到 pArchive中吗? 比如: *pArchive>>textcontent;你说他们 “是按照写入的顺序依次从文件中读入”,就是说是按照写入的顺序读出来? 那如果我只想把 version信息取出来呢 ,难道也要把所有信息都读出来才可以得到 version?>>>然后比较类标志,是Point类再读取版本号
    比较标志的意思就是说看这个文件的格式是不是符合 读文件的程序,比如读 .pdf文件的时候,看看标志是不是Acrobat(打个比方),如果是就读入pdf信息显示出来,如果不是则打不开>>>如果文件中类的版本号比当前的新,就置状态更新
    这个版本号是做什麽用的,是不是如果文件格式更新了,打开文件的程序(acrobat)会把新的信息写入到pdf文件中更新pdf的文件格式?  如果不是这样,“类的版本号”指的是什麽?“比当前的”中的当前指的又是什麽?这是我的理解,如果有错误,请指出,多谢!
      

  4.   

    你上面的理解基本上是对的
    上面的那段程序主要就是把类的标志和版本信息写入文件,如果类中还有其他的成员变量也可以依次写入文件,例如如果Point类还有两个变量
    int x;//横坐标
    int y;//纵坐标
    你可以改写
    if (pArchive->IsStoring()) {
              (*pArchive) << Point::m_strSignature;
              (*pArchive) << Point::m_nVersion;
              (*pArchive) << Point::x;
              (*pArchive) << Point::y;
          } else {
              CString strSignature;  
              (*pArchive) >> strSignature;
              if (strSignature != Point::m_strSignature)
                 return (Status::InvalidFormat);  //无效格式
              (*pArchive) >> nVersion;
              if (nVersion > Point::m_nVersion;)
                 return (Status::UnsupportedVersion);  //不支持版本
              (*pArchive) >> x;
              (*pArchive) >> y;
          }
    >>>如果文件中类的版本号比当前的新,就置状态更新
    这句话我写的有误,不是更新状态,而是返回“不支持”
    需要版本可能是考虑你的类结构有可能发生变化,比如增加或者减少了成员变量,这样就需要版本号来区别