设为首页 加入收藏

TOP

新手指南-序列化篇之三(一)
2014-11-23 22:19:22 来源: 作者: 【 】 浏览:2
Tags:新手指南 序列化 之三

在前两部分,我们学习了在通常情况下,如何为序列化提供有力的支持。在这一部分,我们将学习序列化任何一种对象时的特殊的规则。这里有四个常用的参考例子。每个例子都由前一个构成。

序列化一个简单类

序列化一个派生类

序列化一个同源的聚集类

序列化一个异源的聚集类

我们的Searialize()方法将返回以下状态码之一:

l Success

l InvalidFormat

l UnsupportedVersion

l ReadError

l WriteError

序列化一个简单类

一个“简单类”的定义是:一个即没有父类,也没有聚集类的对象。序列化一个简单的类需要以下步骤:

1. 序列化对象签名和版本

2. 序列化对象成员(如果有)

在下面的例子中,类Point包含两个int型变量,表示点的坐标。对象的签名和版本定义成静态成员(m_strSignature和m_nVersion),所以每个Point类的实例都共享它们。

int Point::serialize

(CArchive* pArchive)

{

ASSERT (pArchive != NULL);

// Step 1: Serialize signature and version

int nVersion;

try {

if (pArchive->IsStoring()) {

(*pArchive) << Point::m_strSignature;

(*pArchive) << Point::m_nVersion;

} else {

CString strSignature;

(*pArchive) >> strSignature;

if (strSignature != Point::m_strSignature)

return (Status::InvalidFormat);

(*pArchive) >> nVersion;

if (nVersion > Point::m_nVersion;)

return (Status::UnsupportedVersion);

}

// Step 2: Serialize members

if (pArchive->IsStoring()) {

(*pArchive) << m_nX;

(*pArchive) << m_nY;

} else {

(*pArchive) >> m_nX;

(*pArchive) >> m_nY;

}

}

catch (CException* pException) {

// A read/write error occured

pException->Delete();

if (pArchive->IsStoring())

return (Status::WriteError);

return (Status::ReadError);

}

// Object was successfully serialized

return (Status::Success);

}

序列化一个派生类

派生类是指派生于一个简单类,并且不是一个聚集类的类。序列化一个派生类需要以下步骤:

1. 序列化对象签名和版本

2. 序列化对象的基类<<额外的步骤

3. 序列化对象的成员(如果有)

在下面的例子中,类ColoredPoint从Point类派生,并且增加一个叫做m_nColor的int型变量,表示点的颜色。如同所有序列化的类一样,ColoredPoint类也定义一个静态签名和版本。

int ColoredPoint::serialize

(CArchive* pArchive)

{

ASSERT (pArchive != NULL);

// Step 1: Serialize signature and version

int nVersion;

try {

if (pArchive->IsStoring()) {

(*pArchive) << ColoredPoint::m_strSignature;

(*pArchive) << ColoredPoint::m_nVersion;

} else {

CString strSignature;

(*pArchive) >> strSignature;

if (strSignature != ColoredPoint::m_strSignature)

return (Status::InvalidFormat);

(*pArchive) >> nVersion;

if (nVersion > ColoredPoint::m_nVersion;)

return (Status::UnsupportedVersion);

}

// Step 2: Serialize the base class

int nStatus = Point::serialize (pArchive);

if (nStatus != Status::Success)

return (nStatus);

// Step 3: Serialize members

if (pArchive->IsStoring())

(*pArchive) << m_nColor;

else

(*pArchive) >> m_nColor;

}

catch (CException* pException) {

// A read/write error occured

pException->Delete();

if (pArchive->IsStoring())

return (Status::WriteError);

return (Status::ReadError);

}

// Object was successfully serialized

return (Status::Success);

}

序列化一个同源的聚集类

同源聚集类常常用来存储数量不定的多个同类型对象。序列化同源聚集类需要以下步骤:

1. 序列化对象签名和版本

2. 序列化对象的基类(如果有)

3. 序列化聚集对象的数量<<额外的步骤

4. 序列化每个聚集对象<<额外的步骤

5. 序列化对象的其它成员(如果有)

在下面的例子中,类ColoredPointList是一个ColoredPoint对象的聚集。为了简单,ColoredPointList类使用CPtrArray来存储对象。如同所有序列化类一样,ColoredPointList类也定义了一个静态签名和版本。以下是Colored

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇新手指南-序列化篇之一 下一篇一个无边框的Qt实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: