共用方式為


串行化:建立可串行化類別

必須執行五個主要步驟,才能將類別串行化。 它們如下所列,並在下列各節中說明:

  1. 從 CObject 衍生您的類別 (或衍生自 CObject的某些類別)。

  2. 覆寫 Serialize 成員函式

  3. 在類別宣告中使用 DECLARE_SERIAL 巨集

  4. 定義不採用自變數的建構函式

  5. 在類別的實作檔案中使用 IMPLEMENT_SERIAL 巨集

如果您直接呼叫 Serialize 而不是透過 >><< 的 和 運算符,則串行化不需要最後三個步驟。

衍生您的類別自 CObject

基本串行化通訊協定和功能定義於類別中 CObject 。 藉由將類別從 CObject(或從衍生自 CObject 的類別)繼承,如以下類別 CPerson 的宣告所示,您可以存取 CObject 的序列化協議和功能。

覆寫串行化成員函式

定義在Serialize類別中的CObject成員函式負責序列化數據,以實際捕捉物件目前的狀態。 函 Serialize 式具有 CArchive 用來讀取和寫入對象數據的自變數。 CArchive 物件具有成員函式,IsStoring指出是Serialize儲存(寫入數據)還是載入(讀取數據)。 使用IsStoring的結果作為指引,您可以使用插入運算子CArchive<<物件中插入對象的數據,或使用擷取運算子>>來擷取數據。

請考慮衍生自 CObject 的類別,而且有兩個新的成員變數,類型 CStringWORD。 下列類別宣告片段顯示新的成員變數和被覆蓋的 Serialize 成員函式的宣告:

class CPerson : public CObject
{
public:
   DECLARE_SERIAL(CPerson)
   // empty constructor is necessary
   CPerson();
   virtual ~CPerson();

   CString m_name;
   WORD   m_number;

   void Serialize(CArchive& archive);
};

覆寫 Serialize 成員函式

  1. 呼叫 的基類版本 Serialize ,以確定對象的繼承部分已串行化。

  2. 插入或擷取類別特有的成員變數。

    插入和擷取運算子會與封存類別互動,以讀取和寫入數據。 下列範例示範如何對上述宣告的Serialize類別實作CPerson

    void CPerson::Serialize(CArchive& archive)
    {
       // call base class function first
       // base class is CObject in this case
       CObject::Serialize(archive);
    
       // now do the stuff for our specific class
       if (archive.IsStoring())
          archive << m_name << m_number;
       else
          archive >> m_name >> m_number;
    }
    

您也可以使用 CArchive::ReadCArchive::Write 成員函式來讀取和寫入大量不具類型的數據。

使用 DECLARE_SERIAL 巨集

在支持序列化的類別宣告中,需要使用DECLARE_SERIAL巨集,如下所示:

class CPerson : public CObject
{
public:
   DECLARE_SERIAL(CPerson)

使用無自變數定義建構函式

MFC 在物件被反序列化(從磁碟載入)時需要預設建構函式以重新建立物件。 反序列化過程將會填入所有成員變數,以重新建立物件所需的值。

這個建構函式可以宣告為公用、受保護或私用。 如果您將其設為受保護或私用,請協助確定它只會由串行化函式使用。 建構函式必須將 物件置於允許視需要刪除的狀態。

備註

如果您忘記在使用DECLARE_SERIAL和IMPLEMENT_SERIAL巨集的類別中定義沒有自變數的建構函式,您將會在使用IMPLEMENT_SERIAL巨集的行上收到「沒有可用的預設建構函式」編譯程式警告。

在實作檔案中使用 IMPLEMENT_SERIAL 宏指令

當您從 CObject衍生可串行化類別時,會使用 IMPLEMENT_SERIAL 巨集來定義所需的各種函式。 您在類別的實作檔案(.CPP)中使用這個巨集。 巨集的前兩個自變數是 類別的名稱和其直接基類的名稱。

這個巨集的第三個自變數是架構編號。 架構編號基本上是 類別物件的版本號碼。 針對架構編號,使用大於或等於0的整數。 (請勿將此架構編號與資料庫術語混淆。

MFC 串行化程式代碼會在將物件讀入記憶體時檢查架構編號。 如果磁碟上對象的架構編號不符合記憶體中類別的架構編號,連結庫會擲回 CArchiveException,以防止程式讀取不正確的物件版本。

如果您想要讓 Serialize 成員函式能夠讀取多個版本,也就是以不同版本的應用程式撰寫的檔案,您可以使用值 VERSIONABLE_SCHEMA 做為IMPLEMENT_SERIAL巨集的自變數。 如需使用方式資訊和範例,請參閱 GetObjectSchema 類別 CArchive的成員函式。

下列範例示範如何將 IMPLEMENT_SERIAL 用於衍生自 CPerson的類別CObject

IMPLEMENT_SERIAL(CPerson, CObject, 1)

擁有可串行化類別之後,您可以串行化 類別的物件,如 串行化:串行化物件一文所述。

另請參閱

串行化