在前两部分,我们学习了在通常情况下,如何为序列化提供有力的支持。在这一部分,我们将学习序列化任何一种对象时的特殊的规则。这里有四个常用的参考例子。每个例子都由前一个构成。
序列化一个简单类
序列化一个派生类
序列化一个同源的聚集类
序列化一个异源的聚集类
我们的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