程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 新手指南-序列化篇之三

新手指南-序列化篇之三

編輯:關於C語言

在前兩部分,我們學習了在通常情況下,如何為序列化提供有力的支持。在這一部分,我們將學習序列化任何一種對象時的特殊的規則。這裡有四個常用的參考例子。每個例子都由前一個構成。

Ø        序列化一個簡單類

Ø        序列化一個派生類

Ø        序列化一個同源的聚集類

Ø        序列化一個異源的聚集類

我們的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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved