首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> VC.NET >> 正文

VC程序设计中可序列化类的实现

  内容提要:本文以简单的例子介绍在Visual C++编程中数据读写的基本方法和可序列化类的实现,并简单介绍了Visual C++中序列化的使用。

  数据读写是应用程序中必不可少的一部分,Visual C++中数据的读写当然也十分重要,因此VisualC++在MFC中对数据的读写创造了十分好的支持,这使得我们可以十分方便的实现我们对数据读写操作的需要。

  MFC 为数据读写设计了三个基本的类--CFile(文件类)、CStdioFile(标准I/O文件类)、CArchive(文档类)。其中标准I/O文件类提供相当于C的流式文件的功能,可以用文本或者二进制方式打开,可以被缓冲。文件类提供了非缓冲的二进制输入输出文件,它既可以与文档类结合实现VisualC++设计中常用的文件序列化,也可以由设计者自己订制存储方案,实现数据的读写操作(此方法的兼容问题需要解决,保密性强)。文档类是VisualC++程序设计中最常用的文件处理的方法,文档类可以方便的实现VisualC++中大多数数据类型的读写操作。

  文档类不仅可以实现简单数据结构的读写操作,还可以通过对CObiect类的派生实现对复杂数据结构的读写操作,由于该方法是VisualC++程序设计的基本方法,本文就以一个简单的例子来介绍可序列化类的实现方法。

  实现条件:

  实现序列化的的类需要满足一系列条件:

  1. 该类需要从CObject类派生(可以是间接派生);

  2. 在类中中进行DECLARE_SERIAL宏定义;

  3. 类存在有缺省的构造函数;

  4. 类中实现了Serialize()函数,并且在其中调用基类的序列化函数;

  5. 使用IMPLEMENT_SERIAL宏指明类名及版本号;

  下面是我在学习Windows程序设计课程是实现的一个程序的一个类的部分代码,为了方便,删去了与本文无关的函数及部分语句并添加了一点注解。

class CMapVertex : public CObject//实现序列化的类一般由CObject派生
{
 DECLARE_SERIAL(CMapVertex)//序列化一般会需要进行DECLARE_SERIAL宏定义
 public:
  CMapVertex();//实现序列化需要有缺省的构造函数
  void Serialize(CArchive &ar);
  CMap<unsigned,unsigned&,float,float&> m_pre;
  //其它数据及函数的声明
  CMapVertex* next;
};
IMPLEMENT_SERIAL(CMapVertex,CObject,0)//序列化类一般需要指明类名及版本号
//其它函数的定义
void CMapVertex::Serialize(CArchive &ar)
{
 if(ar.IsStoring())
 {
  //其它数据写操作
 }
 else
 {
  //其它数据读操作
 }
 m_pre.Serialize(ar);// MFC已经为集合类实现了序列化可以调用序列化函数
 CObject:: Serialize(ar);
 //实现序列化的类一般需要在序列化函数中调用其基类的序列化函数
}//////////////////////////////////////////////////////////////////////
class CMyMap : public CObject
{
 DECLARE_SERIAL(CMyMap)
 public:
  CMapVertex* m_TopVertex;
  UINT m_VertexNum;//记录链表中的元素数目
  CMyMap();
  void Serialize(CArchive&ar);
  //其它数据及函数的声明
};
IMPLEMENT_SERIAL(CMyMap,CObject,0)
//其它函数的定义
void CMyMap::Serialize(CArchive &ar)
{
 CMapVertex*temp=m_TopVertex;
 if(ar.IsStoring())
 {
  ar<<m_VertexNum;//读取时需要先知道元素的个数,所以先保存m_VertexNum
  for(UINT i=0;i<m_VertexNum;i++)
  {
   temp->Serialize(ar);
   temp=temp->next;
  }
  //其它数据写操作
 }
 else
 {
  ar>>m_VertexNum;
  if(m_VertexNum!=0)
  {
   temp=m_TopVertex=new CMapVertex;
   //链表中的元素需要在堆中进行分配内存空间,析构时会释放空间
   m_TopVertex->Serialize(ar);
  }
  for(UINT i=1;i<m_VertexNum;i++)
  {
   temp->next=new CMapVertex;
   temp=temp->next;//用缺省函数构造的节点的next为NULL
   temp->Serialize(ar);//CMapVertex类已实现序列化
  }
  //其它数据读操作
 }
 CObject:: Serialize(ar);


[1] [2] 下一页

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航