Serialization入门读物---PART1

系列化入门 读物

 

这个指南描述如何轻松地系列化一个简单的对象。

这篇文章包含三个部分。

PART1  介绍基本的系列化

PART2  解释如何有效地读取无效数据和支持版本。

PART3  描述如何对复杂的对象进行系列化。

 

系列化入门读物 - PART1

系列化是从永久存储媒体(例如:磁盘文件)读取或者写入对象的处理过程。系列化一个对象需要3个因素:1、一个 CFile 表示数据文件;2、一个 CArchive 对象提供对系列化上下文件的支持;对象是可系列化的。

 

Step 1 - Open the datafile( 打开数据文件 )

对文件“ foo.dat” 中的对象进行系列化,需要用适当的方式打开文件。在这个例子中,文件打开只用了: read/write 方式。

// Open file "foo.dat" CFile* pFile = new CFile(); ASSERT (pFile != NULL); if (!pFile->Open ("foo.dat", CFile::modeReadWrite | CFile::shareExclusive)) { // Handle error return; }

Step 2 - Hook up the archive( archive 连接 )

下一步,把一个 CArchive 对象与此文件连接, Archive 提供了有效的方法进行永久存储。你可以从 archive 存取数据来代替直对文件进行存取。 Archive 需要知道你将要用它进行存取的数据。在这个例子,我们假定你要进行写数据操作。

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

Step 3 - Serialize the object (系列化对象)

最后,我们 serialize 对象通过调用 serialize() 方法。在 MFC Cobject Serialize() 已经建立,但是它不做事情。并且,你不用从 Cobject 派生你的对象。我们的 serialize() 方法拥有一个 Carchive 的指针且返回整型的状态。

int CFoo::serialize (CArchive* pArchive) { int nStatus = SUCCESS; // Serialize the object ... ... return (nStatus); }

一会儿我们将进行实际系列化操作,其间我们将看到重要的两个问题:

l         对永久存储器的读和写都是用 Cfoo::serialize() 方法。

l         Cfoo::serizlize() 并不知道其进行访问的文件的任何信息。

假定 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 的流操作运算符 << >> 对文档进行读写。对于 int,float,DWORD Cstring 对象这些简单的数据类型, CArchive 知道如何进行 serizlize Carchive 同样知道是进行读还是写,你可以通过 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); }   


Step 4 - Clean up (清除对象)

当你结束系列化进,你一定要进行清除从而关闭 archive 和数据文件。

  pArchive->Close(); delete pArchive; pFile->Close(); delete pFile();   




你可能感兴趣的:(object,serialization,null,delete,存储,archive)