📄 untitled-21.txt
字号:
for(。nt。= o;。< "Count; l++)
ar>> pL。nesLi」;
在语句
SI>>flCOUflt;
被执行时,CArchive进人档案中检索4个字节,并将它们复制给"Count。这样就为从档案中
检索CLine的for循环作了准备。每次语句
ar>> "Lines[i」;
执行时,>>运算符都将调用 CArchive:: Readobject并传递一个 NULL指针。下面是 Afx. nil
中的相关程序代码:
.AFX INLINE CArchive&AFXAPI operator>>(CArchive&ar,C0bject。&pob)
pob= ar.ReadobDect(MILL); return ar; I
_AFXINLINE CArchive& AFXAPI operator>>(CArchive& ar,
const CObaect。& pob)
{ pob= ar.Readobject(NULL); return ar;
Readobject调用另一个 CArchive函数 ReadClass来确定即将并行化的对象种类。在第一
次循环过程中,ReadClass从档案中读出一个字,由于是新类标记,它继续从档案中读出模式
编号和类名。然后ReadClass比较从档案中得到的模式编号和保存在CRuntimeClass结构中
的模式编号,该结构与检索得到的类关联。 (DECLAR_SERIAL和 IMpLEMENTSERIAL宏
创建一个静态CRuntimeClass结构,其中包含有关类的重要信息,包括类名和模式编号。MFC
维持着一个CRuntimeClass结构的链接列表,可以用来查找到特定类的运行时信息。)如果模
式编号相同,ReadClass就给Readobject返回CRuntimeClass指针,接下来Readobject将调用通
过 CRuntimeClass指针 Createobject来创建一个类的新实例,然后调用对象的 Serialize函数从
档案中给对象数据成员加载数据。由ReadClass返回的指向新的类实例的指针被保存在调
用者指定的地方,本例中是pLines「i」的地址处。
在从档案中读出类信息过程中,Readobject也像 Writeobject那样在内存中创建了一个数
据库。在从档案中读取第二个CLine时,它前面的0x80OI标记告诉ReadClass可以从数据库
中获得Readobject要求的CRuntimeClass指针。
如果一切顺利的话,串行化过程基本就是这样。我跳过了许多细节内容,如:MFC执行
的多种出错检查,对NULL对象指针的特殊处理,以及同一个对象的多个引用等。
如果从档案中读出的模式编号与保存在相应的CRuntimeClass中的模式编号不匹配怎
么办?输人不同版本的模式。MFC首先检查保存在CRuntimeClass内模式编号中的VER-
S10NABLE—SCHEMA标志。如果标志不存在,MFC产生CArchiveException。到此为止,串行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -