查看内容

VisualC++设计中文件序列化的实现

  • 2020-04-02 15:03
  • 新浦京计算机网络
  • Views

  实现条件:

IMPLEMENT_SERIAL (Your nameofclass,CObject,1)

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

上述这段代码总体意思就是,当向ar保存数据时,把m_nType、m_strFileName、m_dwFileSize保存到ar中;当读取ar中数据时,把ar中的数据读取到m_nType、m_strFileName、m_dwFileSize中。

**  本文的第二个例子模拟了MFC中链表集合类的序列化方法,在MFC的集合类中就是用类似的方法完成的。我们可以通过该例看出在对象的个数不固定的时候的方法,我们需要存放对象时先存放对象的数目,在读取的时候就可以按照存放的数目读取固定的对象。另外我们可以发现的一个十分有趣的事情时,我们上面所说的五项内容似乎与序列化的关系不大--只要获得文档类对象就可以完成基本的操作。为什么需要进行那么多项与主题"无关"的操作呢?其实如果我们如果仅需要完成简单的数据读写操作,我们的确没有必要做那些工作,但是通过那些工作我们可以较为简单的实现一些复杂的数据操作,比如在CObject类中已经实现了AssertValid,GetRuntimeClass,IsKindOf等类的判断操作,而且使用析取和插入运算符也必须完整地完成上述内容,更重要的是如果

2、 序列化存储的应用和局限

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

{

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

     序列化存储可以把对象存储到磁盘上,但它并不能代替数据库设计的信息存储,因为它只是顺序的存取,没有检索机制。

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

if (ar.IsStoring())

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

      // TODO: add loading code here

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

DECLARE_SERIAL( Your name of class)

**实现细节:

3、 序列化的类

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);
}

 

5.必须重载基类中的序列化函数Serialize

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

   }

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

MFC程序在打开或关闭文件操作的时候,会调用该函数。默认的该函数并没有对我们自己的数据(m_studentList)进行存取。我们在该函住中加入的最后一行代码序列化了我们的数据对象。当然这都需要我们自己编写自己数据类的Serialize函数。如下:(摘自vc技术内幕上的代码)

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

}

void CStudentDoc::Serialize(CArchive&ar)

}

      // TODO: add storing code here

{

else

  TRACE("Entering CStudent::Serializen");

4、 MFC中序列化的使用

}

其中的第三个参数代表版本号

1、 序列化提出和定义

序列化在面向对象的程序设计中出现的,它基于对象是可以连续的思想,在程序退出或者启动的时候,可以把对象顺序的存储在磁盘或者从磁盘读出,存储和读出对象的过程叫做序列化。

   if(ar.IsStoring()) {

上一篇:PlaySound 下一篇:没有了