必須執行五個主要步驟,才能將類別串行化。 它們如下所列,並在下列各節中說明:
從 CObject 衍生您的類別 (或衍生自
CObject的某些類別)。在類別宣告中使用 DECLARE_SERIAL 巨集。
如果您直接呼叫 Serialize 而不是透過 >><< 的 和 運算符,則串行化不需要最後三個步驟。
衍生您的類別自 CObject
基本串行化通訊協定和功能定義於類別中 CObject 。 藉由將類別從 CObject(或從衍生自 CObject 的類別)繼承,如以下類別 CPerson 的宣告所示,您可以存取 CObject 的序列化協議和功能。
覆寫串行化成員函式
定義在Serialize類別中的CObject成員函式負責序列化數據,以實際捕捉物件目前的狀態。 函 Serialize 式具有 CArchive 用來讀取和寫入對象數據的自變數。
CArchive 物件具有成員函式,IsStoring指出是Serialize儲存(寫入數據)還是載入(讀取數據)。 使用IsStoring的結果作為指引,您可以使用插入運算子CArchive在<<物件中插入對象的數據,或使用擷取運算子>>來擷取數據。
請考慮衍生自 CObject 的類別,而且有兩個新的成員變數,類型 CString 與 WORD。 下列類別宣告片段顯示新的成員變數和被覆蓋的 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 成員函式
呼叫 的基類版本
Serialize,以確定對象的繼承部分已串行化。插入或擷取類別特有的成員變數。
插入和擷取運算子會與封存類別互動,以讀取和寫入數據。 下列範例示範如何對上述宣告的
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::Read 和 CArchive::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)
擁有可串行化類別之後,您可以串行化 類別的物件,如 串行化:串行化物件一文所述。