网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
Visual C++中对象的序列化与文件I/O研究
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
// 对点击的点进行连线绘图
 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. 直接或间接从CObject类派生出一个新类。

  2. 在类的声明部分包含MFC的DECLARE_SERIAL宏,该宏只需要将类名作为参数。

  3. 重载基类的Serialize()函数,并添加对数据成员进行序列化的代码。

  4. 如果构造函数没有一个空的缺省的构造函数(不含任何参数),为其添加一个。

  5. 在类的实现部分,添加MFC的IMPLEMENT_SERIAL宏。该宏需要三个参数:类名,基类名和一个方案号。其中方案号是一个相当于版本号的整数,每当改变了类的序列化数据格式后就应当及时更改此数值。
根据上述步骤不难对上一小节中的序列化代码进行封装,封装后的持久类CPosition负责对类成员变量m_nCount和m_ptPosition[100]的序列化,封装后的代码如下:

// CPosition类声明部分:
class CPosition : public CObject
{
 DECLARE_SERIAL(CPosition)
 CPosition();
 int m_nCount;
 CPoint m_ptPosition[100];
 void Serialize(CArchive& ar);
 CPoint GetValue(int index);
 void SetValue(int index, CPoint point);
 virtual ~CPosition();
};
……
// CPosition类实现部分:
IMPLEMENT_SERIAL(CPosition, CObject, 0)
CPosition::CPosition()
{
 // 对类成员进行初始化
 m_nCount = 0;
 for (int i = 0; i < 100; i++)
  m_ptPosition[i] = CPoint (0, 0);
}
CPosition::~CPosition()
{
}
void CPosition::SetValue(int index, CPoint point)
{
 // 设置指定点的坐标值
 m_ptPosition[index] = point;
}
CPoint CPosition::GetValue(int index)
{
 // 获取指定点的坐标值
 return m_ptPosition[index];
}
void CPosition::Serialize(CArchive &ar)
{
 CObject::Serialize(ar);
 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];
 }
}

  在创建了自定义持久类CPosition后,可以通过该类对鼠标点击过的点的坐标进行管理,由于序列化的工作已由类本身完成,因此只需在文档类的Serialize()函数中对CPosition的Serialize()成员函数进行调用即可:

void CSample04Doc::Serialize(CArchive& ar)
{
 // 使用定制持久类
 m_Position.Serialize(ar);
 if (ar.IsStoring())
 {
 }
 else
 {
 }
}
文件I/O

  虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便捷方式,但有时在程序中需要对文件处理过程拥
  • 下一篇资讯: VC保存文件的参考代码
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号