📄 untitled-19.txt
字号:
sir。ng.GetData()->nDataLength。 sizeof(TCHAR));
ret二urn ar:
Z
CA。hive:: Write将指定量的数据复制到档案的内部缓冲区中,并在必要的时候为防止
溢出而清空缓冲区。偶尔,如果用<<运算符串行化给档案的CString包含Unicode字符,
MFC就会在字符数之前给档案写人一个特殊的3位标记。这就使得MFC可以标识串行化
的字符串字符的类型,以便在字符串从档案中并行化时在必要的情况下将字符转换为用户
希望的格式。换句话说,由Unicode应用程序串行化一个字符串而让ANSI应用程序并行化
它,或者相反,都是完全可以的。
在给档案串行化 C0bject指针时可以看到更有趣的情况。下面是 Afx.nil中相关的代码:
.AFX. INLINE CArChive& AFXAPI operator<<( CArchive& ar,
const CObject。 pob)
老 ar.WrlteobDect(P0b); return ar;【
您可以看到,<<运算符调用了 CArchive:: Writeobject并给它传递了出现在插人符右边的指
针,例如,
ar<< purne;
中的 pline。 Writeobject最终会调用对象的 Serialize函数来串行化对象的数据成员,但在此
之前它要给档案写人附加信息,用来标识所创建对象的类。
例如:假设要串行化的对象是 CLine的实例。第一次给档案串行化 CDne时,Writeob
ject将在档案中插人一个“新类标记”,是16位整型数,其值为一l或oxFFFF;接着是对象的
16位模式编号,一个16位值表示类名的字符数;最后才是类名自身。Writeobject然后调用
Cline的Serialize函数来串行化Cline的数据成员。
如果给档案写第二个 CLine,Writeobject操作就不同了。在给档案写人新类标记时,
Writeobject将给内存中的数据库(实际上是CMapPtrToPtr的实例)添加一个类名并给该类分
配一个唯一的标识符(实际上是数据库的索引号)。如果以前没有其他类被写人档案中,那
么第一个写到磁盘上的CLine会得到索引号1。在请求给档案写人第二个CLine时,
Writeobject先检查数据库,看看是否有CLine记录,为了不给档案写人多余的信息,它会写人
一个由带有“旧类标记”(0x8000)的类索引号ORed组成的16位值。然后像以前一样调用
CLine的Serialize函数。这样写人档案中的类的第一个实例由新类标记、模式编号以及类名
标记;后来的实例将由一个16位值标记,其中低15位标识上此记录的模式编号和类名。
图6-2给出了档案的十六进制转储描述,其中档案包含两个已串行化版本1的CLine。
用下列程序片段将CLine写人档案中:
人Create two CLines and initialize an array of pointers.
CLine linel(CPoint(0, 0), CPoint(SO, 50》;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -