Partager via


Serialization: Making a Serializable, classe

Cinq étapes principales sont requises pour créer une classe sérialisable.Ils sont répertoriés ci-dessous et expliquées dans les sections suivantes :

  1. Dérivation de la classe de CObject (ou d'une classe dérivée d' CObject).

  2. substituer la fonction membre Serialize.

  3. Utilisation de la macro DECLARE_SERIAL dans la déclaration de classe.

  4. Définissant un constructeur qui ne prend pas d'arguments.

  5. En utilisant la macro d'IMPLEMENT_SERIAL dans le fichier d'implémentation pour votre classe.

Si vous appelez Serialize directement de préférence à les opérateurs de >> et de << de CArchive, les trois dernières étapes ne sont pas obligatoires pour la sérialisation.

Dérivation de la classe de CObject

Le protocole et les fonctionnalités de base de sérialisation sont définis dans la classe d' CObject .En dérivant votre classe d' CObject (ou d'une classe dérivée d' CObject), comme indiqué dans la déclaration suivante de la classe CPerson, vous accédez au fournisseur de sérialisation et les fonctionnalités d' CObject.

Substituer la fonction membre Serialize

La fonction membre d' Serialize , définie dans la classe d' CObject , est chargé de sérialiser réellement les données nécessaires pour capturer l'état actuel d'un objet.La fonction d' Serialize possède un argument d' CArchive qu'elle utilise pour lire et écrire des données d'objet.L'objet de CArchive a une fonction membre, IsStoring, qui indique si Serialize d'enregistrements (écriture de données) ou chargement (données de lecture).À l'aide de les résultats d' IsStoring en tant que modèle, vous insérez des données de votre objet de l'objet d' CArchive avec les données d'insertion d'opérateur (<<) ou d'extrait avec l'opérateur d'extraction (>>).

Considérez une classe dérivée d' CObject et a deux nouvelles variables membres, les types CString et WORD.Le fragment suivant de déclaration de classe affiche les nouvelles variables membres et la déclaration de la fonction membre substituée d' 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 );
};

Pour substituer la fonction membre Serialize

  1. Appelez votre version de classe de base d' Serialize pour vous assurer que la partie héritée de l'objet est sérialisée.

  2. Insérez ou récupérez les variables membres spécifiques à votre classe.

    La mise en place et les opérateurs d'extraction interagissent avec la classe d'archivage pour lire et écrire des données.L'exemple suivant montre comment implémenter Serialize pour la classe d' CPerson déclarée précédemment :

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

Vous pouvez également utiliser les fonctions membres de CArchive::Read et de CArchive::Write pour lire et écrire un grand nombre de données non typées.

Utilisation de la macro DECLARE_SERIAL

La macro d' DECLARE_SERIAL est requise dans la déclaration des classes qui prennent en charge la sérialisation, comme indiqué ci-après :

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

Définir un constructeur sans argument

MFC requiert un constructeur par défaut lorsqu'il recrée vos objets tels qu'ils sont désérialisés (chargé à partir de le disque).Le processus de désérialisation remplira toutes les variables membres avec les valeurs requises pour recréer l'objet.

Ce constructeur peut être déclaré public, protégé, ou privé.Si vous le faites protégé ou privé, vous contribuez vous assurez qu'il ne sera utilisé par les fonctions de sérialisation.Le constructeur doit mettre l'objet dans un état qui lui permet à supprimer si nécessaire.

[!REMARQUE]

Si vous oubliez de définir un constructeur sans argument dans une classe qui utilise des macros d' DECLARE_SERIAL et d' IMPLEMENT_SERIAL , vous obtiendrez à un « aucun constructeur par défaut » l'avertissement du compilateur disponible sur la ligne où la macro d' IMPLEMENT_SERIAL est utilisée.

En utilisant la macro d'IMPLEMENT_SERIAL dans le fichier d'implémentation

La macro d' IMPLEMENT_SERIAL est utilisée pour définir les diverses fonctionnalités nécessaires lorsque vous dérivez une classe sérialisable d' CObject.Vous utilisez cette macro dans le fichier d'implémentation (.CPP) de votre classe.Les deux premiers arguments à la macro est le nom de la classe et le nom de sa classe de base immédiate.

Le troisième argument à cette macro est un nombre schéma.Le nombre de schéma est essentiellement un numéro de version pour les objets de la classe.Utilisez supérieur ou égal à un entier 0 pour le nombre de schéma.(Ne confondez pas ce numéro schéma avec la terminologie de base de données.)

Le code de sérialisation MFC le nombre de schéma en lisant les objets en mémoire.Si le nombre de schéma de l'objet sur le disque ne correspond pas au nombre de schéma de la classe en mémoire, la bibliothèque lèvera CArchiveException, empêchant votre programme de lire une version incorrecte de l'objet.

Si vous souhaitez que votre fonction membre d' Serialize pour pouvoir lire plusieurs versions - c. autrement dit., fichiers écrits avec différentes versions de l'application — vous pouvez utiliser la valeur VERSIONABLE_SCHEMA comme argument à la macro d' IMPLEMENT_SERIAL .Pour les informations d'utilisation et un exemple, consultez la fonction membre d' GetObjectSchema de la classe CArchive.

l'exemple suivant montre comment utiliser IMPLEMENT_SERIAL pour une classe, CPerson, qui est dérivée d' CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Une fois que vous avez une classe sérialisable, vous pouvez sérialiser les objets de la classe, comme décrit dans l'article sérialisation : sérialiser un objet.

Voir aussi

Concepts

Sérialisation dans MFC