Serialization入门读物---PART1 (转)

Serialization入门读物---PART1 (转)[@more@]

系列化入门读物XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

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

这篇文章包含三个部分。

PART1  介绍基本的系列化

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

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

 

系列化入门读物-PART1

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

 

ASPectratio="t">windows.000/TEMP/msoclip1/02/clip_image001.gif" o:href="http://www.codeproject.com/cpp/serialization_primer1/serialization1_flow.gif">.NET/develop/article/images/16246_1.jpg" align=baseline border=0>

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

 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-975823/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752019/viewspace-975823/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值