按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
矩形。我打算用以下类别,组织这份文件:
CObject CRect
CObject CRect
CObList CPoint
CObList CPoint
CDWordArray
CDWordArray CSize
CSize
CStroke
CStroke
CRectangle
CRectangle
CCircle
CDocument
CDocument
CMyDoc
CMyDoc
其中CObList 和CDWordArray 是MFC 提供的类别,前者是一个串行,可放置任何从
CObject 衍生下来的对象,后者是一个数组,每一个元素都是〃double word〃。另外三个
类别:CStroke 和CRectangle 和CCircle,是我从CObject 中衍生下来的类别。
class CMyDoc : public CDocument
{
CObList m_graphList;
CSize m_sizeDoc;
。。。
};
class CStroke : public CObject
{
CDWordArray m_ptArray; // series of connected points
。。。
};
class CRectangle : public CObject
{
CRect m_rect;
。。。
};
class CCircle : public CObject
161
…………………………………………………………Page 224……………………………………………………………
第篇 勿在浮砂築高台
{
CPoint m_center;
UINT m_radius;
。。。
};
假设现有一份文件,内容如图3…3,如果你是Serialize 机制的设计者,你希望怎么做呢?
把图3…3 写成这样的文件内容好吗:
06 00 ;CObList elements count
07 00 ;class name string length
43 53 74 72 6F 6B 65 ;〃CStroke〃
02 00 ;DWordArray size
28 00 13 00 ;point
28 00 13 00 ;point
0A 00 ;class name string length
43 52 65 63 74 61 6E 67 6C 65 ;〃CRectangle〃
11 00 22 00 33 00 44 00 ;CRect
07 00 ;class name string length
43 43 69 72 63 6C 65 ;〃CCircle〃
55 00 66 00 77 00 ;CPoint & radius
07 00 ;class name string length
43 53 74 72 6F 6B 65 ;〃CStroke〃
02 00 ;DWordArray size
28 00 35 00 ;point
28 00 35 00 ;point
0A 00 ;class name string length
43 52 65 63 74 61 6E 67 6C 65 ;〃CRectangle〃
11 00 22 00 33 00 44 00 ;CRect
07 00 ;class name string length
43 43 69 72 63 6C 65 ;〃CCircle〃
55 00 66 00 77 00 ;CPoint & radius
还算堪用。但如果考虑到屏幕卷动的问题,以及打印输出的问题,应该在最前端增加「文
件大小」。另外,如果这份文件有100 条线条,50 个圆形,80 个矩形,难不成我们要记
录230 个类别名称?应该有更好的方法才是。
162
…………………………………………………………Page 225……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
CObList m_graphList
CObList m_graphList
图3…3 一个串行, 内含三种基本图形: 线条、圆形、矩形。
我们可以在每次记录对象内容的时候,先写入一个代码,表示此对象之类别是否曾在档
案中记录过了。如果是新类别,乖乖地记录其类别名称;如果是旧类别,则以代码表示。
这样可以节省文件大小以及程序用于解析的时间。啊,不要看到文件大小就想到硬盘很
便宜,桌上的一切都将被带到网上,你得想想网络频宽这回事。
还有一个问题。文件的「版本」如何控制?旧版程序读取新版文件,新版程序读取旧版
文件,都可能出状况。为了防弊,最好把版本号码记录上去。最好是每个类别有自己的
版本号码。
下面是新的构想,也就是Serialization 的目标:
163
…………………………………………………………Page 226……………………………………………………………
第篇 勿在浮砂築高台
20 03 84 03 ;Document Size
06 00 ;CObList elements count
FF FF ;new class tag
02 00 ;schema
07 00 ;class name string length
43 53 74 72 6F 6B 65 ;〃CStroke〃
02 00 ;DWordArray size
28 00 13 00 ;point
28 00 13 00 ;point
FF FF ;new class tag
01 00 ;schema
0A 00 ;class name string length
43 52 65 63 74 61 6E 67 6C 65 ;〃CRectangle〃
11 00 22 00 33 00 44 00 ;CRect
FF FF ;new class tag