`
weimou66
  • 浏览: 1250345 次
文章分类
社区版块
存档分类
最新评论

新手指南-序列化篇之一

 
阅读更多

序列化初步(翻译)

原著: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();


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happyparrot/archive/2004/12/08/208799.aspx

分享到:
评论

相关推荐

    新手指南-序列化篇之三.docx

    新手指南-序列化篇之三

    SQL Server 2008商业智能完美解决方案 3/3

    《SQL Server 2008商业智能完美解决方案》结合专家团队提供的实际示例和丰富经验进行介绍,让读者能够直观轻松地掌握构建商业智能(BI)解决方案的概念、工具和技术,是一本不可多得的商业智能开发参考指南。...

    asp.net知识库

    泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载...

    SQL Server 2008商业智能完美解决方案 1/3

    《SQL Server 2008商业智能完美解决方案》结合专家团队提供的实际示例和丰富经验进行介绍,让读者能够直观轻松地掌握构建商业智能(BI)解决方案的概念、工具和技术,是一本不可多得的商业智能开发参考指南。...

    SQL Server 2008商业智能完美解决方案 2/3

    《SQL Server 2008商业智能完美解决方案》结合专家团队提供的实际示例和丰富经验进行介绍,让读者能够直观轻松地掌握构建商业智能(BI)解决方案的概念、工具和技术,是一本不可多得的商业智能开发参考指南。...

    SQL Server 2008 商业智能完美解决方案(3)

    《SQL Server 2008商业智能完美解决方案》结合专家团队提供的实际示例和丰富经验进行介绍,让读者能够直观轻松地掌握构建商业智能(BI)解决方案的概念、工具和技术,是一本不可多得的商业智能开发参考指南。...

    Tcl_TK编程权威指南pdf

    这本书就是一本帮助你最大限度地利用Tcl/Tk并回避一些我所经历过的令人头痛的问题的实用编程指南。 我接触Tcl语言大概已经有10年的时间了,而本书的第一版也已经出版5年了。在过去的几年中,我一直在John ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,他的著作独具风格,无论是编程新手,还是经验丰富的编程人员,都很容易理解其内容。在个人实践中,Ivor Horton也是一名系统顾问。他从事...

    head first c#.pdf

    之後,你會學到有關類別與物件導向編程、繪製圖形與動畫、使用 LINQ 查詢資料以及將資料序列化到檔案的一切知識。另外,你將透過建造真實專案、實際打造遊戲及解決謎題來學習各種知識。完成本書閱讀之際,你將成為一...

    CuteFTP9简易汉化版

    一种上传软件很简单对于新手FTP用户,然而强大的足以让有经验的用户。 友好的用户界面使您可以轻松地更新和维护复杂的网站。 你可以用一种上传软件维护关键任务文件传输的安全特性。 你甚至可以计划和脚本使用转让...

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    micropython-samples:各种各样的代码提示以及其他存储库的索引

    micropython样本此仓库的第一部分包含... 3.1编写弹性WiFi代码的指南3.2 MicroPython的四个序列化库的序列化回顾3.3 快速模拟信号的相对时序和相位的测量对于Pyboard。 代码样本带有前缀Pyboard的样本是特定于Pyb

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Learning-Kibana-7-Second-Edition:Packt出版的Learning Kibana 7,第二版

    如果您是该工具的新手,或者想了解Kibana 7中引入的最新功能,则这本书是完美的初学者指南。 您将学习如何设置和配置Elastic Stack,并了解Kibana在架构中的位置。 随着您的前进,您将学习如何使用Beats或Logstash...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...

    spring security 参考手册中文版

    4.样品和指南(从这里开始) 28 5. Java配置 29 5.1 Hello Web安全Java配置 29 5.1.1 AbstractSecurityWebApplicationInitializer 31 5.1.2 AbstractSecurityWebApplicationInitializer不存在Spring 31 5.1.3使用...

    Keras中文手册

    模块性:模型可理解为一个独立的序列或图,完全可配置的模块以最少的代价自由组合在一起。具 体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可 以使用它们来构建自己的模型...

Global site tag (gtag.js) - Google Analytics