Condividi tramite


Serializzazione: creazione di una classe serializzabile

Cinque passaggi principali necessari per creare una classe serializzabile. Vengono elencati sotto e spiegato nelle sezioni seguenti:

  1. Derivare la classe da CObject (o da una classe derivata da CObject).

  2. Eseguire l'override della funzione membro Serialize.

  3. L'utilizzo della macro di DECLARE_SERIAL nella dichiarazione di classe.

  4. Definendo un costruttore che non accetta argomenti.

  5. L'utilizzo della macro di IMPLEMENT_SERIAL nel file di implementazione per la classe.

Se si chiama direttamente Serialize anziché tra >> gli operatori e << di CArchive, gli ultimi tre operazioni non sono richiesti per la serializzazione.

Derivare la classe da CObject

Il protocollo e la funzionalità di base di serializzazione vengono definiti nella classe di CObject. Derivare la classe da CObject (o da una classe derivata da CObject), come illustrato nella figura seguente dichiarazione di classe CPerson, l'accesso al protocollo di serializzazione e la funzionalità di CObject.

Eseguire l'override della funzione membro Serialize

La funzione membro di Serialize, definita nella classe di CObject, è responsabile effettivamente di serializzare i dati necessari per acquisire lo stato corrente di un oggetto. La funzione di Serialize dispone di un argomento di CArchive utilizzato per leggere e scrivere i dati object. L'oggetto di CArchive contiene una funzione membro, IsStoring, che indica se Serialize memorizza (scrittura di dati) o caricamento (dati di lettura). Utilizzando i risultati di IsStoring come guida, inserire i dati dell'oggetto nell'oggetto di CArchive con l'operatore di inserimento (<<) o dati estrai con l'operatore di estrazione (>>).

Si consideri una classe derivata da CObject e presenta due nuovi variabili membro, di tipi CString e WORD. Nel frammento della dichiarazione di classe mostra nuove variabili membro e la dichiarazione della funzione membro ignorata di 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 );
};

Per eseguire l'override della funzione membro Serialize

  1. Chiamare la versione della classe base di Serialize per assicurarsi che la parte ereditata dell'oggetto venga serializzata.

  2. Incollare o estrarre le variabili membro specifici alla classe.

    Gli operatori di estrazione e di inserimento interagiscono con la classe di archiviazione per leggere e scrivere dati. Nell'esempio seguente viene illustrato come implementare Serialize per la classe di CPerson dichiarata su:

    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;
    }
    

È inoltre possibile utilizzare le funzioni membro di CArchive::Write e di CArchive::Read per leggere e scrivere grandi quantità di dati non tipizzati.

L'utilizzo della macro di DECLARE_SERIAL

La macro di DECLARE_SERIAL è obbligatoria nella dichiarazione di classi che supportano la serializzazione, come illustrato di seguito:

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

Definizione del costruttore senza argomenti

MFC richiede un costruttore predefinito quando ricrea gli oggetti mentre sono deserializzati (caricato da disco). Il processo di deserializzazione compilati tutti i membri variabili con valori necessari per ricreare l'oggetto.

Questo costruttore può essere dichiarata public, protected, o private. Se è stata protetto o privato, è possibile assicurarsi che venga utilizzato solo da funzioni di serializzazione. Il costruttore deve inserire l'oggetto in uno stato che consentono l'utilizzo da eliminare se necessario.

Nota

Se non si utilizza di definire un costruttore senza argomenti in una classe che utilizza le macro di IMPLEMENT_SERIAL e di DECLARE_SERIAL, si otterrà un "nessun costruttore predefinito" l'avviso compiler disponibile sulla riga in cui la macro di IMPLEMENT_SERIAL viene utilizzata.

L'utilizzo della macro di IMPLEMENT_SERIAL nel file di implementazione

La macro di IMPLEMENT_SERIAL viene utilizzata per definire le varie funzioni necessarie quando si deriva una classe serializzabile da CObject. Si utilizza questa macro nel file di implementazione (.CPP) della classe. I primi due argomenti a macro sono il nome della classe e il nome della relativa classe di base immediata.

Il terzo argomento a questa macro è un numero dello schema. Il numero dello schema è essenzialmente un numero di versione per gli oggetti della classe. Utilizzare maggiore o uguale a 0 Integer per il numero dello schema. (Non confondere questo numero dello schema con la terminologia del database.)

I controlli di codice di serializzazione MFC il numero dello schema quando si leggono oggetti in memoria. Se il numero dello schema dell'oggetto su disco non corrisponde al numero dello schema della classe nella memoria, la libreria genererà CArchiveException, impedendo al programma di leggere una versione non corretta dell'oggetto.

Se si desidera che la funzione membro di Serialize per poter leggere più versioni, ovvero file creati con versioni diverse dell'applicazione - possibile utilizzare il valore VERSIONABLE_SCHEMA come argomento alla macro di IMPLEMENT_SERIAL. Per utilizzare le informazioni e un esempio, vedere la funzione membro di GetObjectSchema di classe CArchive.

Nell'esempio seguente viene illustrato come utilizzare IMPLEMENT_SERIAL per una classe, CPerson, derivata da CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Dopo avere creato una classe serializzabile, è possibile serializzare gli oggetti della classe, come illustrato nell'articolo Serializzazione: Serializzare un oggetto.

Vedere anche

Concetti

Serializzazione in MFC