新手指南-序列化篇之一

类别:VC语言 点击:0 评论:0 推荐:

序列化初步(翻译)

                原著:http://www.codeproject.com/cpp/serialization_primer1.asp
序列化是从固定存储介质中读和写一个对象的过程,例如磁盘文件。序列化一个对象需要三个要素:

Ø         一个描述数据文件的CFile对象

Ø         一个提供序列化上下文的Carchive对象

Ø         一个可以被序列化的对象
 

第一步:打开数据文件

用适当的存取方式打开用于保存序列化信息的foo.dat文件。在本例中,文件将以独占的可读写方式打开。

// Open file "foo.dat"

  CFile* pFile = new CFile();

  ASSERT (pFile != NULL);

  if (!pFile->Open ("foo.dat", CFile::modeReadWrite | CFile::shareExclusive)) {

      // Handle error

      return;

  }

第二步:和存档挂钩

下一步,将一个CArchive对象和文件挂钩。存档对象提供一个与固定存储间的有效的连接。因此你可以通过从存档中序列化方式读写数据,来取代直接从文件中读写。存档对象必须知道你是需要通过它读还是写数据。在下面的例子中,我们假设是需要写数据。

// Create archive ...

  bool bReading = false;  // ... for writing

  CArchive* pArchive = NULL;

  try

  {

    pFile->SeekToBegin();

    UINT uMode = (bReading ? CArchive::load : CArchive::store);

    pArchive = new CArchive (pFile, uMode);

    ASSERT (pArchive != NULL);

  }

  catch (CException* pException)

  {

    // Handle error

    return;

  }

第三步:序列化对象

最后,我们调用Serialize()函数序列化对象。Serialize()函数是我们自己构造的函数,与MFC的CObject::Serialize()函数没有任何关系。因此你也无需将对象从CObject类继承。我们的Serialize()方法需要传入一个CArchive对象指针,并返回一个表示状态的整数。

int CFoo::serialize

    (CArchive* pArchive)

  {

    int nStatus = SUCCESS;

 

    // Serialize the object ...

    ...

   

    return (nStatus);

  }

我们在一分钟内了解了实际的序列化过程。现在,让我们认识一下一对要点:

1.       从固定存储中读取以及向固定存储中写入数据都是使用Cfoo::Serialize()函数。

2.       Cfoo::Serialize()函数不知道任何关于数据文件的存取方式。

假设Cfoo表示一个包含两个数据成员的雇员记录。

class CFoo

  {

    // Construction/destruction

    public:

      CFoo::CFoo();

      virtual CFoo::~CFoo();

 

    // Methods

    public:

      int serialize (CArchive* pArchive);

 

    // Data members

    public:

      CString  m_strName;  // employee name

      int      m_nId;      // employee id

  };

我们用CArchive的流操作<<和>>分别从存档中读取和写入数据。CArchive知道如何序列化简单类型,比如int ,float ,DWORD,以及对象类型,比如CString。存档也知道它是读还是写模式。你可以通过CArchive::IsStoring()函数来查询存档的读写模式。Cfoo类的序列化方法可以这么写:

int CFoo::serialize

    (CArchive* pArchive)

  {

    int nStatus = SUCCESS;

 

    // Serialize the object ...

    ASSERT (pArchive != NULL);

    try

    {

      if (pArchive->IsStoring()) {

         // Write employee name and id

         (*pArchive) << m_strName;

         (*pArchive) << m_nId;

      }

      else {

         // Read employee name and id

         (*pArchive) >> m_strName;

         (*pArchive) >> m_nId;

      }

    }

    catch (CException* pException)

    {

      nStatus = ERROR;

    }

    return (nStatus);

  }

第四步:清除

当我们完成序列化以后,我们应该关闭存档和数据文件来清除。

pArchive->Close();

  delete pArchive;

  pFile->Close();

  delete pFile();

本文地址:http://com.8s8s.com/it/it405.htm