在前兩部分,我們學習了在通常情況下,如何為序列化提供有力的支持。在這一部分,我們將學習序列化任何一種對象時的特殊的規則。這裡有四個常用的參考例子。每個例子都由前一個構成。
Ø 序列化一個簡單類
Ø 序列化一個派生類
Ø 序列化一個同源的聚集類
Ø 序列化一個異源的聚集類
我們的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類也定義了一個靜態簽名和版本。以下是ColoredPointList類的示例:
class ColoredPointList
{
// Construction/destruction
public:
Col