Compartir a través de


Serialization: Making a Serializable (Clase)

Cinco pasos principales son necesarios para crear una clase serializable.Se enumeran y se explican en las secciones siguientes:

  1. Derivar de la clase de CObject (o de alguna clase derivada de CObject).

  2. Reemplazar la función miembro de Serialize.

  3. Mediante la macro de DECLARE_SERIAL en la declaración de clase.

  4. Definir un constructor que no toma ningún argumento.

  5. Mediante la macro de IMPLEMENT_SERIAL en el archivo de implementación para la clase.

Si llama a Serialize directamente en lugar de a través de los operadores de >> y de << de CArchive, los tres últimos pasos no son necesarios para la serialización.

Derivar de la clase de IU de CObject

El protocolo y la funcionalidad básicos de serialización son definido en la clase de CObject .Derivar la clase de CObject (o una clase derivada de CObject), como se muestra en la siguiente declaración de la clase CPerson, puede obtener acceso al protocolo de serialización y funcionalidad de CObject.

Reemplazar la función miembro de Serialize

La función miembro de Serialize , que se define en la clase de CObject , es responsable realmente de serializar los datos necesarios capturar el estado actual de un objeto.La función de Serialize tiene un argumento de CArchive que utilice para leer y escribir los datos de objeto.El objeto de CArchive tiene una función miembro, IsStoring, que indica si Serialize está almacenando (datos de escritura) o carga (datos de lectura).Mediante los resultados de IsStoring como guía, inserte los datos del objeto en el objeto de CArchive con el operador de inserción (<<) o datos de extraer con el operador de extracción (>>).

Considere una clase que se deriva de CObject y tiene dos nuevas variables miembro, tipos CString y WORD.El siguiente fragmento de la declaración de clase muestra las nuevas variables miembro y la declaración de la función invalidada de miembro de 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 );
};

Para reemplazar la función miembro de Serialize

  1. Llame a la versión de la clase base de Serialize para asegurarse de que la parte heredado del objeto se serializada.

  2. Inserte o extraer las variables miembro específicas a la clase.

    Los operadores de inserción y de extracción interactúan con la clase del archivo para leer y escribir los datos.El ejemplo siguiente se muestra cómo implementar Serialize para la clase de CPerson declarada anteriormente:

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

También puede utilizar CArchive::Read y el miembro de CArchive::Write funciona para leer y escribir grandes cantidades de datos sin tipo.

Mediante la macro de DECLARE_SERIAL

La macro de DECLARE_SERIAL se requiere en la declaración de clases que admitan la serialización, como se muestra aquí:

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

Definir un Constructor sin argumentos

MFC requiere un constructor predeterminado cuando vuelve a crear los objetos mientras se deserializan (carga desde el disco).El proceso de deserialización completará a todas las variables miembros con los valores necesarios para volver a crear el objeto.

Este constructor se puede declarar public, protected, o privado.Si lo crea protegido o privado, ayuda a asegurarse de que se usará sólo las funciones de serialización.El constructor debe colocar el objeto en un estado que permite que se elimine en caso necesario.

[!NOTA]

Si olvida definir un constructor sin argumentos en una clase que utilice macros de DECLARE_SERIAL y de IMPLEMENT_SERIAL , no obtendrá una “ninguna advertencia del compilador disponibles del constructor predeterminado” en la línea donde se utiliza la macro de IMPLEMENT_SERIAL .

Mediante la macro de IMPLEMENT_SERIAL en el archivo de implementación

La macro de IMPLEMENT_SERIAL se utiliza para definir las diversas funciones necesarias al derivar una clase serializable de CObject.Utiliza esta macro en el archivo de implementación (.CPP) de la clase.Los primeros dos argumentos a la macro es el nombre de la clase y el nombre de la clase base inmediata.

El tercer argumento a esta macro es un número de esquema.El número de esquema es esencialmente un número de versión para los objetos de la clase.Utilice un mayor o igual que 0 entero para el número de esquema.(No confunda este número de esquema con terminología de la base de datos).

El código comprueba de serialización de MFC el número del esquema al leer objetos en memoria.Si no coincide con el número del esquema del objeto en el disco el número del esquema de la clase en la memoria, la biblioteca producirá CArchiveException, evitando que el programa lee una versión incorrecta del objeto.

Si desea que la función miembro de Serialize pueda leer varias versiones (es decir, archivos escritos en versiones diferentes de la aplicación) puede utilizar el valor VERSIONABLE_SCHEMA como argumento a la macro de IMPLEMENT_SERIAL .Para obtener información de uso y un ejemplo, vea la función miembro de GetObjectSchema de la clase CArchive.

El ejemplo siguiente se muestra cómo utilizar IMPLEMENT_SERIAL para una clase, CPerson, que es derivada de CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

Una vez que tiene una clase serializable, puede serializar objetos de clase, como se describe en el artículo serialización: Serialización de un objeto.

Vea también

Conceptos

Serialización en MFC