Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se requieren cinco pasos principales para convertir una clase en serializable. A continuación se enumeran y se explican en las secciones siguientes:
Derivación de la clase de CObject (o de alguna clase derivada de
CObject
).Usar la macro DECLARE_SERIAL en la declaración de clase.
Con la macro IMPLEMENT_SERIAL en el archivo de implementación de la clase .
Si llama Serialize
directamente a en lugar de a través de los >> operadores y << de CArchive, los tres últimos pasos no son necesarios para la serialización.
Derivación de la clase de CObject
El protocolo de serialización básico y la funcionalidad se definen en la CObject
clase . Al derivar la clase de CObject
(o de una clase derivada de CObject
), como se muestra en la siguiente declaración de clase CPerson
, obtiene acceso al protocolo de serialización y a la funcionalidad de CObject
.
Invalidación de la función miembro Serialize
La Serialize
función miembro, que se define en la CObject
clase , es responsable de serializar realmente los datos necesarios para capturar el estado actual de un objeto. La Serialize
función tiene un CArchive
argumento que usa para leer y escribir los datos del objeto. El objeto CArchive tiene una función miembro, , IsStoring
que indica si Serialize
está almacenando (escribiendo datos) o cargando (lectura de datos). Con los resultados de IsStoring
como guía, inserta los datos del objeto en el CArchive
objeto con el operador de inserción (<<) o extrae datos con el operador de extracción (>>).
Considere una clase derivada de CObject
y tiene dos nuevas variables de miembro, de tipos CString
y WORD. El fragmento de declaración de clase siguiente muestra las nuevas variables de miembro y la declaración de la función miembro invalidada 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 invalidar la función miembro Serialize
Llame a la versión de clase base de para asegurarse de
Serialize
que la parte heredada del objeto está serializada.Inserte o extraiga las variables miembro específicas de la clase.
Los operadores de inserción y extracción interactúan con la clase de archivo para leer y escribir los datos. En el ejemplo siguiente se muestra cómo implementar
Serialize
para laCPerson
clase 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 usar las funciones miembro CArchive::Read y CArchive::Write para leer y escribir grandes cantidades de datos sin tipo.
Uso de la macro DECLARE_SERIAL
La macro DECLARE_SERIAL es necesaria en la declaración de clases que admitirán 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 a medida que se deserializan (cargados desde el disco). El proceso de deserialización rellenará todas las variables miembro con los valores necesarios para volver a crear el objeto.
Este constructor se puede declarar público, protegido o privado. Si la convierte en protegida o privada, le ayudará a asegurarse de que solo la usará las funciones de serialización. El constructor debe colocar el objeto en un estado que le permita eliminarlo si es necesario.
Nota:
Si olvida definir un constructor sin argumentos en una clase que use los DECLARE_SERIAL y IMPLEMENT_SERIAL macros, recibirá una advertencia del compilador "sin constructor predeterminado disponible" en la línea donde se usa la macro IMPLEMENT_SERIAL.
Uso de la macro IMPLEMENT_SERIAL en el archivo de implementación
La macro IMPLEMENT_SERIAL se usa para definir las distintas funciones necesarias cuando se deriva una clase serializable de CObject
. Esta macro se usa en el archivo de implementación (. CPP) para su clase. Los dos primeros argumentos de la macro son el nombre de la clase y el nombre de su clase base inmediata.
El tercer argumento de esta macro es un número de esquema. El número de esquema es básicamente un número de versión para los objetos de la clase . Use un entero mayor o igual que 0 para el número de esquema. (No confunda este número de esquema con la terminología de la base de datos).
El código de serialización de MFC comprueba el número de esquema al leer objetos en memoria. Si el número de esquema del objeto en disco no coincide con el número de esquema de la clase en memoria, la biblioteca iniciará un CArchiveException
, lo que impedirá que el programa lea una versión incorrecta del objeto.
Si desea Serialize
que la función miembro pueda leer varias versiones (es decir, archivos escritos con diferentes versiones de la aplicación), puede usar el valor VERSIONABLE_SCHEMA como argumento para la macro IMPLEMENT_SERIAL. Para obtener información de uso y un ejemplo, vea la función miembro de la GetObjectSchema
clase CArchive
.
En el ejemplo siguiente se muestra cómo usar IMPLEMENT_SERIAL para una clase , CPerson
que se deriva de CObject
:
IMPLEMENT_SERIAL(CPerson, CObject, 1)
Una vez que tenga una clase serializable, puede serializar objetos de la clase, como se describe en el artículo Serialización: Serialización de un objeto.