搜狐首页 - 新闻 - 体育 - 娱乐 - 财经 - IT - 汽车 - 房产 - 女人 - 短信 - 彩信 - 校友录 - 邮件 - 搜索 - BBS - 搜狗 
搜狐首页 >> IT频道 >> 数码天下 >> 网狐教程-搜狐IT >> 程序开发-网狐教程-搜狐IT >> C语言
Visual C++中对象的序列化与文件I/O研究
IT.SOHU.COM  2004-07-23 14:32  作者: 郎锐  转自: 天极网
页面功能 【我来说两句】【我要“揪”错】【推荐】【字体: 】【打印】 【关闭

  持久性和序列化

  持久性是对象所有的保存和加载其状态数据的能力。具有这种能力的对象能够在应用程序结束之前以某种方式将当前的对象状态数据记录下来,当程序再次运行时,通过对这些数据的读取而恢复到上一次任务结束时的状态。由于绝大多数的MFC类是直接或间接由MFC的CObject类派生出来的,因此这些MFC类都具有保存和加载对象状态的能力,是具有持久性的。在使用应用程序向导生成文档/视结构的程序框架时,就已经为应用程序提供了用于对象状态数据保存和加载的基本代码。

  为实现对象的持久性,通常多以字节流的形式将记录对象状态的数据存放到磁盘上,这种将状态数据保存到磁盘和从磁盘恢复到内存的过程称为序列化。序列化是MFC的一个重要概念,是MFC文档/视图结构应用程序能进行文档打开、保存等操作的基础。当在MFC框架程序中装载或保存一个文件时,除了打开文件以供程序读写外,还传递给应用程序一个相关的CArchive对象,并以此实现对持久性数据的序列化。

  大多数MFC应用程序在实现对象的持久性时并非直接用MFC的CFile类对磁盘文件进行读写(有关CFile类的详细介绍将在下一节进行),而是通过使用CArchive对象并由其对CFile成员函数进行调用来执行文件I/O操作。CArchive类支持复合对象的连续二进制形式的输入输出。在构造一个CArchive对象或将其连接到一个表示打开的文件的CFile对象后,可以指定一个档案是被装载还是被保存。MFC允许使用操作符“<<”和“>>”来对多种原始数据类型进行序列化。这些原始数据类型包括BYTE,WORD,LONG,DWORD,float,double,int,unsigned int,short和char等。

  对于其他由MFC类来表示的非原始数据类型如CString对象等的序列化则可以通过对“<<”和“>>”运算符的重载来解决,可以用此方式进行序列化的MFC类和结构有CString,CTime,CTimeSpan,COleVariant,COleCurreny,COleDateTime,COleDateTimeSpan,CSize,CPoint,CRect,SIZE,POINT和RECT等。除了操作符“<<”和“>>”之外还可以调用CArchive类成员函数Read()和Write()来完成序列化。下面这段代码展示了通过操作符对int型变量VarA、VarB的序列化过程:

// 将VarA、VarB存储到档案中
CArchive ar (&file, CArchive::store);
ar << VarA << VarB;
……
// 从档案装载VarA、VarB
CArchive ar (&file, CArchive::load)
ar >> VarA >> VarB;

  CArchive类仅包含有一个数据成员m__pDocument。在执行菜单上的打开或保存命令时,程序框架将会把该数据成员设置为要被序列化的文档。另外需要特别注意的是:在使用CArchive类时,要保证对CArchive对象的操作与文件访问权限的统一。

  在本文下面将要给出的示例程序中,将对绘制连线所需要的关键点坐标和坐标个数等持久性对象进行序列化。其中文档类的成员变量m_nCount和m_ptPosition[100]分别记录了当前点的个数和坐标,初始值为0。当鼠标点击客户区时将对点的个数进行累加,并保存当前点的坐标位置。随后通过Invalidate()函数发出WM_PAINT消息通知窗口对客户区进行重绘,在重绘代码中对这些点击过的点进行绘图连线:

void CSample04View::OnLButtonDown(UINT nFlags, CPoint point)
{
 // 获取指向文档类的指针
 CSample04Doc* pDoc = GetDocument();
 // 保存当前鼠标点击位置
 pDoc->m_ptPosition[pDoc->m_nCount] = point;
 if (pDoc->m_nCount < 100)
  pDoc->m_nCount++;
 // 刷新屏幕
 Invalidate();
 CView::OnLButtonDown(nFlags, point);
}
……
void CSample04View::OnDraw(CDC* pDC)
{
 CSample04Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // 对点击的点进行连线绘图
 pDC->MoveTo(pDoc->m_ptPosition[0]);
 for (int i = 1; i < pDoc->m_nCount; i++)
  pDC->LineTo(pDoc->m_ptPosition[i]);
}


  从上述程序代码不难看出,为了能保存绘制结果需要对文档类的成员变量m_nCount和m_ptPosition[100]进行序列化处理。而文档类成员函数Serialize()则通过Archive类为这些持久性对象的序列化提供了功能上的支持。下面的代码完成了对持久性对象的保存和加载:

if (ar.IsStoring())
{
 // 存储持久性对象到档案
 ar << m_nCount;
 for (int i = 0; i < m_nCount; i++)
  ar << m_ptPosition[i];
}
else
{
 // 从档案装载持久性对象
 ar >> m_nCount;
 for (int i = 0; i < m_nCount; i++)
  ar >> m_ptPosition[i];
}

[1] [2] [3下一页 
页面功能 【我来说两句】【我要“揪”错】【推荐】【字体: 】【打印】 【关闭




ChinaRen - 搜狐招聘 - 网站登录 - 帮助中心 - 设置首页 - 广告服务 - 联系方式 - 保护隐私权 - About SOHU - 公司介绍
Copyright © 2005 Sohu.com Inc. All rights reserved. 搜狐公司 版权所有

相关链接
  • VC中Windows系统预定义标准控件的创建和使用(07/20 16:04)
  • VC中Windows系统预定义标准控件的创建和使用(07/20 16:04)
  • VC中Windows系统预定义标准控件的创建和使用(07/20 16:04)
  • VC中Windows系统预定义标准控件的创建和使用(07/20 16:03)
  • VC++中定制个性化的对话框窗口类(07/19 14:20)
  • VC++中定制个性化的对话框窗口类(07/19 14:20)
  • 相机也可虚拟?新版VC就是办得到(04/27 10:41)
  • 相机也可虚拟?新版VC就是办得到(04/27 10:38)
  • VC编程实现IE风格的界面之叙述(03/19 13:14)
  • VC用Ado接口连接和使用数据库(03/19 13:14)

  •  ■ 我来说两句
    用  户:        匿名发出:
    请各位遵纪守法并注意语言文明。
     
    *经营许可证编号:京ICP00000008号
    *《互联网电子公告服务管理规定》
    *《全国人大常委会关于维护互联网安全的规定》
    短信内容:
    手 机
    自写包月5分钱/条 更多>>
    搜狐天气为你抢先报! 魔力占卜姻缘一线牵!
    金币不是赚的是抢的! 爱情玄机任由你游戏!
    猪八戒这样泡到紫霞! 帅哥一定要看的宝典!
    你受哪颗星星的庇护? 萨达姆最新关押照片!
    精彩彩信
    [和弦]欧若拉 一生有你
    沧海一声笑
    [音效]挪威的森林
    爆铃 MP3 G点图 动画
    [和弦]童话 你到底爱谁
    [原唱]一千年以后 断点
    [爆笑音效]赚钱拉 野花
    [串烧]张韶涵 潘玮柏
    精彩短信
    [和弦]小薇 好心分手
    [音效]当当当当 忘记


    搜狐商城
    ·家电|品牌风扇新品热销
    ·音乐|秦海璐幸福回味
    ·图书|《眼镜蛇事件》
    更多...