设为首页 加入收藏

TOP

17.2.2 文档类实现中的序列化(1)
2013-10-07 16:13:27 来源: 作者: 【 】 浏览:62
Tags:17.2.2 文档 实现 序列化

17.2.2  文档类实现中的序列化(1)

在SketcherDoc.cpp文件中,有两个部分与序列化有关。第一个部分是与DECLARE_ DYNCREATE()宏互补的IMPLEMENT_DYNCREATE()宏:
 

  1. // SketcherDoc.cpp : implementation of the CSketcherDoc class  
  2. //  
  3. #include "stdafx.h"  
  4. // SHARED_HANDLERS can be defined in an ATL project implementing preview, thumbnail  
  5. // and search filter handlers and allows sharing of document code with that project.  
  6. #ifndef SHARED_HANDLERS  
  7. #include "Sketcher.h"  
  8. #include "PenDialog.h"  
  9. #endif  
  10. #include "SketcherDoc.h"  
  11. #include <propkey.h> 
  12. #ifdef _DEBUG  
  13. #define new DEBUG_NEW  
  14. #endif  
  15. // CSketcherDoc  
  16. IMPLEMENT_DYNCREATE(CSketcherDoc, CDocument)  
  17. // Message maps and the rest of the file...  

这个宏把CSketcherDoc类的基类定义为CDocument。为了正确地动态创建CSketcherDoc对象,包括创建继承这个基类的成员,必须有这个宏。

1. Serialize()函数

在CSketcherDoc类实现中还包括Serialize()函数的定义:

  1. void CSketcherDoc::Serialize(CArchive& ar)  
  2. {  
  3. if (ar.IsStoring())  
  4. {  
  5. // TODO: add storing code here  
  6. }  
  7. else  
  8. {  
  9. // TODO: add loading code here  
  10. }  
  11. }  

该函数序列化这个类的数据成员。传递给这个函数的参数ar是对CArchive类对象的引用。如果操作是在文件中存储数据成员,那么这个类对象的IsStoring()成员将返回TRUE,如果操作是从以前存储的文档中读回数据成员,则返回FALSE。

因为Application Wizard不知道您的文档中包含什么数据,所以就像注释所表明的那样,读写这些信息的过程全依赖于您。为了了解这个过程,下面比较详细地分析一下CArchive类。

2. CArchive类

CArchive类是发动序列化机制的引擎。C++(www.cppentry.com)中的流操作在控制台程序中从键盘读取数据,然后写入屏幕,CArchive类则提供了基于MFC的流操作。CArchive对象提供了一种机制,将您的对象流出后放到文件中,或者重新把它们恢复为输入流,在这个过程中自动地重新构造类的对象。

CArchive对象有一个与其相关联的CFile对象,它为二进制文件提供了磁盘输入/输出功能,并且提供到物理文件的实际连接。在序列化过程中,CFile对象处理文件输入和输出操作的所有具体问题,CArchive对象处理组织写入的对象数据或者根据读取的信息重新构造对象的逻辑问题。只有在构造自己的CArchive对象时,才需要考虑关联对象CFile的细节问题。对于Sketcher程序中的文档,框架已经进行了处理,并且把它构造的CArchive对象ar传递给CSketcherDoc中的Serialize()函数。在实现Serialize()函数的序列化时,可以在添加到形状类中的所有Serialize()函数中使用相同的对象。

CArchive类重载了析取和插入运算符(<<和>>),它们对派生于CObject的类的对象以及大量基本数据类型分别进行输入和输出操作。这些重载运算符处理下列对象类型和简单类型,见表17-1。

表  17-1

   
   
bool
布尔值,真或假
float
标准单精度浮点值
double
标准双精度浮点值
BYTE
8位无符号整数
char
8位字符
wchar_t
16位字符
short
16位有符号整数
int
32位有符号整数
LONG和long
32位有符号整数

(续表)

   
   
LONGLONG
64位有符号整数
ULONGLONG
64位无符号整数
WORD
16位无符号整数
DWORDunsigned int
32位无符号整数
CString
定义字符串的CString对象
SIZECSize
该对象把尺寸定义为cx, cy
POINTCPoint
该对象把点定义为x, y
RECTCRect
该对象利用矩形的左上角和右下角定义矩形
CObject*
指向CObject的指针
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇17.2.1 文档类定义中的序列化 下一篇17.2.2 文档类实现中的序列化(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)