大家好: 上有个序列化的例子,这段代码有些不理解:
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怎麽知道 这三个字符串代表的是谁呢?请指点!
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怎麽知道 这三个字符串代表的是谁呢?请指点!
解决方案 »
- 这段代码是什么意思,在vc下编译的,我是新手,希望大家帮帮忙!
- 这段BitBlt代码没有反映是什么回事?
- 基于对话框应用程序的菜单的创建?
- 大虾帮忙:请问VC有没有检测系统语言的API?
- 一个关于加载dll的问题
- 有关全局的HDC对象引用?
- 请教一个小问题,在此谢谢
- 请问如何给 Droplist 添加CString成员变量? (不是看起来的简单问题)
- 如何在MFC regular dll中加入ActiveX
- 急!!!!Clistctrl 网格的问题
- 蔡鸟求救:编译问题error LNK2001: unresolved external symbol __endthreadex
- 为什么调用SetModifiedFlag(true)之后不会立即调用DoPropExchange()函数???
Point::m_strSignature 是Point类的标志
Point::m_nVersion 是Point类的版本
程序只是把这两个内容写入到文件中
读取的时候也是按照写入的顺序依次从文件中读入,然后比较类标志,是Point类再读取版本号,如果文件中类的版本号比当前的新,就置状态更新。
置于你说的name文件中根本就没有
比较标志的意思就是说看这个文件的格式是不是符合 读文件的程序,比如读 .pdf文件的时候,看看标志是不是Acrobat(打个比方),如果是就读入pdf信息显示出来,如果不是则打不开>>>如果文件中类的版本号比当前的新,就置状态更新
这个版本号是做什麽用的,是不是如果文件格式更新了,打开文件的程序(acrobat)会把新的信息写入到pdf文件中更新pdf的文件格式? 如果不是这样,“类的版本号”指的是什麽?“比当前的”中的当前指的又是什麽?这是我的理解,如果有错误,请指出,多谢!
上面的那段程序主要就是把类的标志和版本信息写入文件,如果类中还有其他的成员变量也可以依次写入文件,例如如果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;
}
>>>如果文件中类的版本号比当前的新,就置状态更新
这句话我写的有误,不是更新状态,而是返回“不支持”
需要版本可能是考虑你的类结构有可能发生变化,比如增加或者减少了成员变量,这样就需要版本号来区别