Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14497485
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:54:54

下载本文示例代码
  内容提要:本文以简单的例子介绍在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 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<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;inext=new CMapVertex;   temp=temp->next;//用缺省函数构造的节点的next为NULL   temp->Serialize(ar);//CMapVertex类已实现序列化  }  //其它数据读操作 } CObject:: Serialize(ar);} 共2页。 1 2 :   内容提要:本文以简单的例子介绍在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 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<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;inext=new CMapVertex;   temp=temp->next;//用缺省函数构造的节点的next为NULL   temp->Serialize(ar);//CMapVertex类已实现序列化  }  //其它数据读操作 } CObject:: Serialize(ar);} 共2页。 1 2 : 下载本文示例代码


VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现VC程序设计中可序列化类的实现
阅读(133) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~