Serialization入门读物---PART1
发表于:2007-07-01来源:作者:点击数:
标签:
系列化入门 读物 这个指南描述如何轻松地系列化一个简单的对象。 这篇文章包含三个部分。 PART1 介绍基本的系列化 PART2 解释如何有效地读取无效数据和支持版本。 PART3 描述如何对复杂的对象进行系列化。 系列化入门读物-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 = SU
CCESS;
// 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();
原文转自:http://www.ltesting.net