Clase CArchive
Te permite guardar una red compleja de objetos en un formato binario permanente (normalmente almacenamiento en disco) que se conserva después de que se eliminen esos objetos.
Sintaxis
class CArchive
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
CArchive::CArchive |
Crea un objeto CArchive . |
Métodos públicos
Nombre | Descripción |
---|---|
CArchive::Abort |
Cierra un archivo sin iniciar una excepción. |
CArchive::Close |
Vacía los datos no escritos y se desconecta de CFile . |
CArchive::Flush |
Vacía los datos no escritos del búfer de archivo. |
CArchive::GetFile |
Obtiene el puntero de objeto CFile para este archivo. |
CArchive::GetObjectSchema |
Se llama desde la función Serialize para determinar la versión del objeto que se está deserializando. |
CArchive::IsBufferEmpty |
Determina si el búfer se ha vaciado durante un proceso de recepción de Windows Sockets. |
CArchive::IsLoading |
Determina si el archivo se está cargando. |
CArchive::IsStoring |
Determina si el archivo está almacenando. |
CArchive::MapObject |
Coloca objetos en el mapa que no se serializan en el fichero, pero que están disponibles para que se haga referencia a los subobjetos. |
CArchive::Read |
Lee bytes sin procesar. |
CArchive::ReadClass |
Lee una referencia de clase almacenada previamente con WriteClass . |
CArchive::ReadObject |
Llama a la función de Serialize un objeto para cargar. |
CArchive::ReadString |
Lee una sola línea de texto. |
CArchive::SerializeClass |
Lee o escribe la referencia de clase al objeto CArchive en función de la dirección de CArchive . |
CArchive::SetLoadParams |
Establece el tamaño en el que crece la matriz de carga. Se debe llamar a antes de que se cargue cualquier objeto o antes de llamar a MapObject o ReadObject . |
CArchive::SetObjectSchema |
Establece el esquema de objeto almacenado en el objeto de archivo. |
CArchive::SetStoreParams |
Establece el tamaño de la tabla hash y el tamaño de bloque del mapa usado para identificar objetos únicos durante el proceso de serialización. |
CArchive::Write |
Escribe bytes sin procesar. |
CArchive::WriteClass |
[in] Escribe una referencia al CRuntimeClass para el CArchive . |
CArchive::WriteObject |
Llama a la función de Serialize un objeto para almacenarla. |
CArchive::WriteString |
Escribe una sola línea de texto. |
Operadores públicos
Nombre | Descripción |
---|---|
CArchive::operator << |
Almacena objetos y tipos primitivos en el archivo. |
CArchive::operator >> |
Carga objetos y tipos primitivos del archivo. |
Miembros de datos públicos
Nombre | Descripción |
---|---|
CArchive::m_pDocument |
Comentarios
CArchive
no tiene una clase base.
Más adelante puedes cargar los objetos desde el almacenamiento persistente, reconstituyéndolas en la memoria. Este proceso de creación de datos persistente se denomina «serialización».
Puedes considerar un objeto de archivo como un tipo de secuencia binaria. Al igual que un flujo de entrada y salida, un archivo está asociado a un fichero y permite la escritura almacenada en búfer y la lectura de datos hacia y desde el almacenamiento. Un flujo de entrada y salida procesa secuencias de caracteres ASCII, pero un archivo procesa los datos de objetos binarios en un formato eficaz y no redundante.
Debes crear un objeto CFile
para poder crear un objeto CArchive
. Además, debes asegurarte de que el estado de carga o almacén del archivo sea compatible con el modo abierto del fichero. Estás limitado a un archivo activo por fichero.
Al construir un CArchive
objeto, lo adjuntas a un objeto de clase CFile
(o una clase derivada) que representa un fichero abierto. También especificas si el archivo se usará para cargar o almacenar. Un objeto CArchive
no solo puede procesar tipos primitivos, sino también objetos de clases CObject
derivadas diseñadas para la serialización. Una clase serializable normalmente tiene una función Serialize
miembro y normalmente usa las macros DECLARE_SERIAL
y IMPLEMENT_SERIAL
, como se describe en la clase CObject
.
Los operadores de extracción sobrecargada ( >>
) e inserción ( <<
) son interfaces de programación de archivo convenientes que admiten tipos primitivos y CObject
clases derivadas.
CArchive
también admite la programación con las clases CSocket
de Windows Sockets de MFC y CSocketFile
. La IsBufferEmpty
función miembro admite ese uso.
Para obtener más información sobre CArchive
, vea los artículos Serialización y Windows Sockets: Uso de sockets con archivos.
Jerarquía de herencia
CArchive
Requisitos
Encabezado: afx.h
CArchive::Abort
Llame a esta función para cerrar el archivo sin iniciar una excepción.
void Abort ();
Comentarios
Normalmente, el destructor CArchive
llamará a Close
, que vaciará los datos que no se hayan guardado en el objeto asociado CFile
. Esto puede provocar excepciones.
Al detectar estas excepciones, es recomendable usar Abort
, de modo que la destrucción del objeto CArchive
no provoque más excepciones. Al controlar excepciones, CArchive::Abort
no producirá una excepción en los errores porque, a diferencia de CArchive::Close
, Abort
omite los errores.
Si has usado new
para asignar el objeto CArchive
en el montón, debes eliminarlo después de cerrar el fichero.
Ejemplo
Vea el ejemplo de CArchive::WriteClass
.
CArchive::CArchive
Construye un objeto CArchive
y especifica si se usará para cargar o almacenar objetos.
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL);
Parámetros
pFile
Un puntero al objeto CFile
que es el origen o destino finales de los datos persistentes.
nMode
Una marca que especifica si los objetos se cargarán desde o se almacenarán en el archivo. Este parámetro nMode
debe tener uno de los valores siguientes:
CArchive::load
Carga datos del archivo. Requiere soloCFile
permiso de lectura.CArchive::store
Guarda los datos en el archivo. RequiereCFile
permiso de escritura.CArchive::bNoFlushOnDelete
Impide que el archivo llameFlush
automáticamente cuando se llama al destructor de archivo. Si estableces esta marca, eres responsable de llamar explícitamente aClose
antes de llamar al destructor. Si no lo haces, los datos se dañarán.
nBufSize
Número entero que especifica el tamaño del búfer del fichero interno, en bytes. El tamaño de búfer predeterminado es 4.096 bytes. Si archivas rutinariamente objetos grandes, mejorarás el rendimiento si usas un tamaño de búfer mayor que sea un múltiplo del tamaño del búfer de ficheros.
lpBuf
Un puntero opcional a un búfer proporcionado por el usuario de tamaño nBufSize
. Si no especificas este parámetro, el archivo asigna un búfer del montón local y lo libera cuando se destruye el objeto. El archivo no libera un búfer proporcionado por el usuario.
Comentarios
No puedes cambiar esta especificación después de haber creado el archivo.
Es posible que no uses CFile
operaciones para modificar el estado del archivo hasta que hayas cerrado el fichero. Cualquier operación de este tipo dañará la integridad del archivo. Puedes acceder a la posición del puntero de fichero en cualquier momento durante la serialización obteniendo el objeto de archivo del fichero de la función miembro GetFile
y, a continuación, usando la función CFile::GetPosition
. Debes llamar CArchive::Flush
a antes de obtener la posición del puntero de fichero.
Ejemplo
CFile file;
TCHAR szBuf[512];
if (!file.Open(_T("CArchive__test__file.txt"),
CFile::modeCreate | CFile::modeWrite))
{
#ifdef _DEBUG
AFXDUMP(_T("Unable to open file\n"));
exit(1);
#endif
}
CArchive ar(&file, CArchive::store, 512, szBuf);
CArchive::Close
Vacía los datos restantes en el búfer, cierra el archivo y desconecta el archivo del fichero.
void Close();
Comentarios
No se permiten más operaciones en el archivo. Después de cerrar un archivo, puedes crear otro archivo para el mismo fichero o puedes cerrarlo.
La función Close
miembro garantiza que todos los datos se transfieren del archivo al fichero y hace que el archivo no esté disponible. Para completar la transferencia del fichero al medio de almacenamiento, primero debes usar CFile::Close
y, a continuación, destruir el CFile
objeto.
Ejemplo
Consulta el ejemplo de CArchive::WriteString.
CArchive::Flush
Obliga a que los datos que quedan en el búfer de archivos se escriban en el fichero.
void Flush();
Comentarios
La función Flush
miembro garantiza que todos los datos se transfieren del archivo al fichero. Debes llamar CFile::Close
a para completar la transferencia del archivo al medio de almacenamiento.
Ejemplo
CFile myFile(_T("CArchive__test__file.txt"),
CFile::modeCreate | CFile::modeWrite);
CArchive ar(&myFile, CArchive::store);
// Write a string to the archive.
ar.WriteString(_T("My string."));
// Flush all of the data to the file.
ar.Flush();
CArchive::GetFile
Obtiene el puntero de objeto CFile
para este archivo.
CFile* GetFile() const;
Valor devuelto
Un puntero constante al objeto en uso CFile
.
Comentarios
Debes vaciar el archivo antes de usar GetFile
.
Ejemplo
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Llama a esta función desde la función Serialize
para determinar la versión del objeto que se está deserializando actualmente.
UINT GetObjectSchema();
Valor devuelto
Durante la deserialización, la versión del objeto que se lee.
Comentarios
Llamar a esta función solo es válida cuando se carga el CArchive
objeto ( CArchive::IsLoading
devuelve un valor distinto de cero). Debe ser la primera llamada a la función Serialize
y se llama solo una vez. Un valor devuelto de ( UINT)-1 indica que el número de versión es desconocido.
Una clase derivada de CObject
se puede usar VERSIONABLE_SCHEMA
combinada (mediante «o» bit a bit (|
)) con la propia versión del esquema (en la IMPLEMENT_SERIAL
macro) para crear un «objeto versionable», es decir, un objeto cuya función Serialize
miembro puede leer varias versiones. La funcionalidad de marco predeterminada (sin VERSIONABLE_SCHEMA
) es producir una excepción cuando la versión no coincide.
Ejemplo
IMPLEMENT_SERIAL(CSchemaObject, CObject, VERSIONABLE_SCHEMA | 1)
void CSchemaObject::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if (ar.IsLoading())
{
int nVersion = ar.GetObjectSchema();
switch (nVersion)
{
case 0:
// read in previous version of
// this object
break;
case 1:
// read in current version of
// this object
break;
default:
// report unknown version of
// this object
break;
}
}
else
{
// Normal storing code goes here
}
}
CArchive::IsBufferEmpty
Llama a esta función miembro para determinar si el búfer interno del objeto de archivo está vacío.
BOOL IsBufferEmpty() const;
Valor devuelto
Distinto de cero si el búfer del archivo está vacío; de lo contrario, 0.
Comentarios
Esta función se proporciona para admitir la programación con la clase CSocketFile
MFC Windows Sockets. No es necesario usarlo para un archivo asociado a un objeto CFile
.
El motivo del uso de IsBufferEmpty
con un archivo asociado a un objeto CSocketFile
es que el búfer del archivo puede contener más de un mensaje o registro. Después de recibir un mensaje, debes usar IsBufferEmpty
para controlar un bucle que continúa recibiendo datos hasta que el búfer esté vacío. Para obtener más información, consulta la función Receive
miembro de la clase CAsyncSocket
, que muestra cómo usar IsBufferEmpty
.
Para más información, consulte Windows Sockets: Uso de sockets con archivos.
CArchive::IsLoading
Determina si el archivo se está cargando datos.
BOOL IsLoading() const;
Valor devuelto
Distinto de cero si el archivo se está usando actualmente para la carga; de lo contrario, 0.
Comentarios
Las funciones de las clases archivadas llaman a esta función miembro Serialize
.
Ejemplo
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Determina si el archivo está almacenando.
BOOL IsStoring() const;
Valor devuelto
Distinto de cero si el archivo se está usando actualmente para almacenar; de lo contrario, 0.
Comentarios
Las funciones de las clases archivadas llaman a esta función miembro Serialize
.
Si el estado IsStoring
de un archivo es distinto de cero, su estado IsLoading
es 0 y viceversa.
Ejemplo
int i = 0;
if (ar.IsStoring())
ar << i;
else
ar >> i;
CArchive::MapObject
Llame a esta función miembro para colocar objetos en el mapa que no se serializan realmente en el fichero, pero que están disponibles para que hagan referencia a los subobjetos.
void MapObject(const CObject* pOb);
Parámetros
pOb
Un puntero constante al objeto que se almacena.
Comentarios
Por ejemplo, es posible que no serialices un documento, pero serializarías los elementos que forman parte del documento. Al llamar a MapObject
, permites que esos elementos, o subobjetos, hagan referencia al documento. Además, los subelementos serializados pueden serializar su puntero m_pDocument
de nuevo.
Puedes llamar a MapObject
cuando almacenes y cargues desde el objeto CArchive
. MapObject
agrega el objeto especificado a las estructuras de datos internas mantenidas por el objeto durante la serialización y deserialización CArchive
, pero a diferencia de ReadObject
y WriteObject
, no llama a serializar en el objeto.
Ejemplo
//MyDocument.h
class CMyDocument : public CDocument
{
public:
DECLARE_SERIAL(CMyDocument)
CObList m_listOfSubItems;
virtual void Serialize(CArchive &ar);
};
//MyDocument.cpp
IMPLEMENT_SERIAL(CMyDocument, CDocument, 1)
void CMyDocument::Serialize(CArchive& ar)
{
CDocument::Serialize(ar);
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
ar.MapObject(this);
//serialize the subitems in the document;
//they will be able to serialize their m_pDoc
//back pointer
m_listOfSubItems.Serialize(ar);
}
//SubItem.h
class CSubItem : public CObject
{
DECLARE_SERIAL(CSubItem)
CSubItem() : m_i(0){};
public:
CSubItem(CMyDocument *pDoc)
{
m_pDoc = pDoc;
}
// back pointer to owning document
CMyDocument *m_pDoc;
WORD m_i; // other item data
virtual void Serialize(CArchive &ar);
};
//SubItem.cpp
IMPLEMENT_SERIAL(CSubItem, CObject, 1);
void CSubItem::Serialize(CArchive &ar)
{
if (ar.IsStoring())
{
// will serialize a reference
// to the "mapped" document pointer
ar << (CObject *)m_pDoc;
ar << m_i;
}
else
{
// Will load a reference to
// the "mapped" document pointer
ar >> (CObject *&)m_pDoc;
ar >> m_i;
}
}
CArchive::m_pDocument
Se establece NULL
en de forma predeterminada, este puntero a CDocument
se puede establecer en cualquier elemento que desee el usuario de la instancia CArchive
.
CDocument* m_pDocument;
Comentarios
Un uso común de este puntero es transmitir información adicional sobre el proceso de serialización a todos los objetos que se serializan. Esto se logra inicializando el puntero con el documento (una clase derivada CDocument
) que se está serializando, de forma que los objetos del documento puedan acceder al documento si es necesario. Este puntero también lo usan los objetos COleClientItem
durante la serialización.
El marco establece m_pDocument
en el documento que se serializa cuando un usuario emite un comando Abrir o Guardar fichero. Si serializas un documento de contenedor de vinculación e inserción de objetos (OLE) por motivos distintos de Abrir o Guardar fichero, debe establecer explícitamente m_pDocument
. Por ejemplo, lo harías al serializar un documento de contenedor en el Portapapeles.
Ejemplo
CFile myFile(_T("My__test__file.dat"),
CFile::modeCreate | CFile::modeWrite);
CArchive ar(&myFile, CArchive::store);
CMyDocument mydoc;
ar.m_pDocument = &mydoc;
// Serialize the document to the archive.
if (ar.m_pDocument != NULL)
ar.m_pDocument->Serialize(ar);
CArchive::operator <<
Almacena el objeto indicado o el tipo primitivo en el archivo.
friend CArchive& operator<<(
CArchive& ar,
const CObject* pOb);
throw(
CArchiveException*,
CFileException*);
CArchive& AFXAPI operator<<(
CArchive& ar,
const RECT& rect);
CArchive& AFXAPI operator<<(
CArchive& ar,
POINT point);
CArchive& AFXAPI operator<<(
CArchive& ar,
SIZE size);
template<typename BaseType,
class StringTraits> CArchive& operator<<(
const ATL::CStringT<BaseType,
StringTraits>& str);
CArchive& operator<<(BYTE by);
CArchive& operator<<(WORD w);
CArchive& operator<<(LONG l);
CArchive& operator<<(DWORD dw);
CArchive& operator<<(float f);
CArchive& operator<<(double d);
CArchive& operator<<(int i);
CArchive& operator<<(short w);
CArchive& operator<<(char ch);
CArchive& operator<<(wchar_t ch);
CArchive& operator<<(unsigned u);
CArchive& operator<<(bool b);
CArchive& operator<<(ULONGLONG dwdw);
CArchive& operator<<(LONGLONG dwdw);
Valor devuelto
Referencia CArchive
que habilita varios operadores de inserción en una sola línea.
Comentarios
Las dos últimas versiones anteriores son específicamente para almacenar enteros de 64 bits.
Si usaste la macro en la IMPLEMENT_SERIAL
implementación de clase, el operador de inserción sobrecargado para CObject
llama a la clase protegida WriteObject
. Esta función, a su vez, llama a la función de la clase Serialize
.
El operador de inserción CStringT
(<<
) admite el volcado de diagnóstico y el almacenamiento de un objeto en un archivo.
Ejemplos
En este ejemplo se muestra el uso del operador de CArchive
inserción con los <<
tipos int
y long
.
long l = 5;
int i = 10;
if (ar.IsStoring())
ar << l << i;
En este ejemplo se muestra el uso del operador CArchive
de <<
inserción con el tipo CStringT
.
CString s("abc");
ar << s; // Prints the value (abc)
CArchive::operator >>
Carga el objeto indicado o el tipo primitivo desde archivo.
friend CArchive& operator>>(
CArchive& ar,
CObject *& pOb);
throw(
CArchiveException*,
CFileException*,
CMemoryException*);
friend CArchive& operator>>(
CArchive& ar,
const CObject *& pOb);
throw(
CArchiveException*,
CFileException*,
CMemoryException*);
CArchive& AFXAPI operator>>(
CArchive& ar,
const RECT& rect);
CArchive& AFXAPI operator>>(
CArchive& ar,
POINT point);
CArchive& AFXAPI operator>>(
CArchive& ar,
SIZE size);
template<typename BaseType,
class StringTraits> CArchive& operator>>(
ATL::CStringT<BaseType,
StringTraits>& str);
CArchive& operator>>(BYTE& by);
CArchive& operator>>(WORD& w);
CArchive& operator>>(int& i);
CArchive& operator>>(LONG& l);
CArchive& operator>>(DWORD& dw);
CArchive& operator>>(float& f);
CArchive& operator>>(double& d);
CArchive& operator>>(short& w);
CArchive& operator>>(char& ch);
CArchive& operator>>(wchar_t& ch);
CArchive& operator>>(unsigned& u);
CArchive& operator>>(bool& b);
CArchive& operator>>(ULONGLONG& dwdw);
CArchive& operator>>(LONGLONG& dwdw);
Valor devuelto
Una referencia CArchive
que habilita varios operadores de extracción en una sola línea.
Comentarios
Las dos últimas versiones anteriores son específicamente para cargar enteros de 64 bits.
Si has usado la macro en la IMPLEMENT_SERIAL
implementación de clase, los operadores de extracción sobrecargados para CObject
llamar a la función protegida ReadObject
(con un puntero de clase en tiempo de ejecución distinto de cero). Esta función, a su vez, llama a la función de la clase Serialize
.
El CStringT
operador de extracción (>>
) admite la carga desde un archivo.
Ejemplos
En este ejemplo se muestra el uso del operador CArchive
de extracción >>
con el tipo int
.
long l;
int i;
if (ar.IsLoading())
ar >> l >> i;
En este ejemplo se muestra el uso de los CArchive
operadores <<
de inserción y extracción y >>
con el tipo CStringT
.
CString s;
if (ar.IsLoading())
ar >> s;
CArchive::Read
Lee un número especificado de bytes del archivo.
UINT Read(void* lpBuf, UINT nMax);
Parámetros
lpBuf
Un puntero al búfer proporcionado por el usuario que va a recibir los datos leídos del archivo.
nMax
Entero sin signo que especifica el número de bytes que se van a leer del archivo.
Valor devuelto
Un entero sin signo que contiene el número de bytes leídos realmente. Si el valor devuelto es menor que el número solicitado, se ha alcanzado el final del fichero. No se produce ninguna excepción en la condición de fin de fichero.
Comentarios
El archivo no interpreta los bytes.
Puedes usar la función Read
miembro dentro de la función Serialize
para leer estructuras normales que están contenidas en los objetos.
Ejemplo
char pbRead[100];
ar.Read(pbRead, 100);
CArchive::ReadClass
Llama a esta función miembro para leer una referencia a una clase almacenada previamente con WriteClass
.
CRuntimeClass* ReadClass(
const CRuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* pObTag = NULL);
Parámetros
pClassRefRequested
Un puntero a la estructura CRuntimeClass
que corresponde a la referencia de clase solicitada. Puede ser NULL
.
pSchema
Un puntero a un esquema de la clase en tiempo de ejecución previamente almacenada.
pObTag
Un número que hace referencia a la etiqueta única de un objeto. Lo usa internamente la implementación de ReadObject
. Expuesto solo para programación avanzada; pObTag
normalmente debe ser NULL
.
Valor devuelto
Un puntero a la estructura CRuntimeClass
.
Comentarios
Si pClassRefRequested
no es NULL
, ReadClass
comprueba que la información de clase archivada sea compatible con la clase en tiempo de ejecución. Si no es compatible, ReadClass
producirá una excepción CArchiveException
.
La clase en tiempo de ejecución debe usar DECLARE_SERIAL
y IMPLEMENT_SERIAL
; de lo contrario, ReadClass
producirá un CNotSupportedException
.
Si pSchema
es NULL
, el esquema de la clase almacenada se puede recuperar llamando a CArchive::GetObjectSchema
; de lo contrario, *pSchema
contendrá el esquema de la clase en tiempo de ejecución que se almacenó anteriormente.
Puedes usar SerializeClass
en lugar de ReadClass
, que controla tanto la lectura como la escritura de la referencia de clase.
Ejemplo
Vea el ejemplo de CArchive::WriteClass
.
CArchive::ReadObject
Lee los datos de objeto del archivo y construye un objeto del tipo adecuado.
CObject* ReadObject(const CRuntimeClass* pClass);
Parámetros
pClass
Un puntero constante a la estructura CRuntimeClass
que corresponde al objeto que espera leer.
Valor devuelto
Un puntero CObject
que se debe convertir de forma segura en la clase derivada correcta mediante CObject::IsKindOf
.
Comentarios
Normalmente, se llama a esta función mediante el operador CArchive
de extracción ( >>
) sobrecargado para un puntero CObject
. ReadObject
, a su vez, llama a la función Serialize
de la clase archivada.
Si proporcionas un parámetro pClass
distinto de cero, que se obtiene mediante la macro RUNTIME_CLASS
, la función comprueba la clase en tiempo de ejecución del objeto archivado. Se supone que ha usados la macro IMPLEMENT_SERIAL
en la implementación de la clase.
Ejemplo
Vea el ejemplo de CArchive::WriteObject
.
CArchive::ReadString
Llame a esta función miembro para leer datos de texto en un búfer del fichero asociado al objeto CArchive
.
BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
Parámetros
rString
Referencia a un CString
objeto que contendrá la cadena resultante después de que se lea del fichero asociado al objeto CArchive
.
lpsz
Especifica un puntero a un búfer proporcionado por el usuario que recibirá una cadena de texto terminada en NULL.
nMax
Especifica el número máximo de caracteres que se van a leer. Debe ser uno menor que el tamaño del búfer de lpsz
.
Valor devuelto
En la versión que devuelve BOOL, TRUE
si se ejecuta correctamente; FALSE
en caso contrario.
En la versión que devuelve un LPTSTR
, un puntero al búfer que contiene los datos de texto; NULL
si se alcanzó el final del fichero.
Comentarios
En la versión de la función miembro con el parámetro nMax
, el búfer contendrá hasta un límite de nMax
- 1 caracteres. La lectura se detiene con un par de retorno de carro-alimentación de línea. Siempre se quitan los caracteres de nueva línea finales. Un carácter nulo NULL
('\0') se anexa en cualquier caso.
CArchive::Read
también está disponible para la entrada en modo de texto, pero no termina en un par de avance de retorno de carro.
Ejemplo
Vea el ejemplo de CArchive::WriteString
.
CArchive::SerializeClass
Llama a esta función miembro cuando quieras almacenar y cargar la información de versión de una clase base.
void SerializeClass(const CRuntimeClass* pClassRef);
Parámetros
pClassRef
Un puntero a un objeto de clase en tiempo de ejecución para la clase base.
Comentarios
SerializeClass
Lee o escribe la referencia de clase al objeto CArchive
en función de la dirección de CArchive
. Usa SerializeClass
en lugar de ReadClass
y WriteClass
como una manera cómoda de serializar objetos de clase base; SerializeClass
requiere menos código y menos parámetros.
Igual que ReadClass
, SerializeClass
comprueba que la información de clase archivada sea compatible con la clase en tiempo de ejecución. Si no es compatible, SerializeClass
producirá una excepción CArchiveException
.
La clase en tiempo de ejecución debe usar DECLARE_SERIAL
y IMPLEMENT_SERIAL
; de lo contrario, SerializeClass
producirá un CNotSupportedException
.
Usa la RUNTIME_CLASS
macro para recuperar el valor del parámetro pRuntimeClass
. La clase base debe haber usado la macro IMPLEMENT_SERIAL
.
Ejemplo
class CBaseClass : public CObject
{
DECLARE_SERIAL(CBaseClass);
};
class CDerivedClass : public CBaseClass
{
public:
virtual void Serialize(CArchive &ar);
};
void CDerivedClass::Serialize(CArchive &ar)
{
if (ar.IsStoring())
{
//normal code for storing contents
//of this object
}
else
{
//normal code for reading contents
//of this object
}
//allow the base class to serialize along
//with its version information
ar.SerializeClass(RUNTIME_CLASS(CBaseClass));
CBaseClass::Serialize(ar);
}
CArchive::SetLoadParams
Llama a SetLoadParams
cuando vayas a leer un gran número de objetos derivados de CObject
de un archivo.
void SetLoadParams(UINT nGrowBy = 1024);
Parámetros
nGrowBy
Número mínimo de ranuras de elemento que se van a asignar si es necesario un aumento de tamaño.
Comentarios
CArchive
usa una matriz de carga para resolver referencias a objetos almacenados en el archivo. SetLoadParams
te permite establecer el tamaño en el que crece la matriz de carga.
No debes llamar a SetLoadParams
después de cargar ningún objeto o después de llamar a MapObject
o ReadObject
.
Ejemplo
class CMyLargeDocument : public CDocument
{
public:
virtual void Serialize(CArchive &ar);
};
void CMyLargeDocument::Serialize(CArchive &ar)
{
if (ar.IsStoring())
ar.SetStoreParams(); // use large defaults
else
ar.SetLoadParams();
if (ar.IsStoring())
{
// code for storing CMyLargeDocument
}
else
{
// code for loading CMyLargeDocument
}
}
CArchive::SetObjectSchema
Llama a esta función miembro para establecer el esquema de objeto almacenado en el objeto de archivo en nSchema
.
void SetObjectSchema(UINT nSchema);
Parámetros
nSchema
Especifica el esquema del objeto.
Comentarios
La siguiente llamada a GetObjectSchema
devolverá el valor almacenado en nSchema
.
Usa SetObjectSchema
para el control de versiones avanzadas; por ejemplo, si deseas forzar que una versión determinada se lea en una función Serialize
de una clase derivada.
Ejemplo
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Usa SetStoreParams
al almacenar un gran número de objetos derivados CObject
en un archivo.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Parámetros
nHashSize
Tamaño de la tabla hash para los mapas de puntero de interfaz. Debe ser un número primo.
nBlockSize
Especifica la granularidad de la asignación de memoria para extender los parámetros. Debe ser una potencia de 2 para obtener el mejor rendimiento.
Comentarios
SetStoreParams
te permite establecer el tamaño de la tabla hash y el tamaño de bloque del mapa usado para identificar objetos únicos durante el proceso de serialización.
No debes llamar a SetStoreParams
después de cargar ningún objeto o después de llamar a MapObject
o WriteObject
.
Ejemplo
class CMyLargeDocument : public CDocument
{
public:
virtual void Serialize(CArchive &ar);
};
void CMyLargeDocument::Serialize(CArchive &ar)
{
if (ar.IsStoring())
ar.SetStoreParams(); // use large defaults
else
ar.SetLoadParams();
if (ar.IsStoring())
{
// code for storing CMyLargeDocument
}
else
{
// code for loading CMyLargeDocument
}
}
CArchive::Write
Escribe un número especificado de bytes del archivo.
void Write(const void* lpBuf, INT nMax);
Parámetros
lpBuf
Un puntero al búfer proporcionado por el usuario que contiene los datos que se van a escribir en el archivo.
nMax
Un entero que especifica el número de bytes que se van a escribir en el archivo.
Comentarios
El archivo no da formato a los bytes.
Puedes usar la función Write
miembro dentro de la función Serialize
para escribir estructuras normales que están contenidas en los objetos.
Ejemplo
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Usa WriteClass
para almacenar la información de versión y clase de una clase base durante la serialización de la clase derivada.
void WriteClass(const CRuntimeClass* pClassRef);
Parámetros
pClassRef
Un puntero a la estructura CRuntimeClass
que corresponde a la referencia de clase solicitada.
Comentarios
WriteClass
escribe una referencia al CRuntimeClass
para la clase base en CArchive
. Usa CArchive::ReadClass
para recuperar la referencia.
WriteClass
comprueba que la información de clase archivada sea compatible con la clase en tiempo de ejecución. Si no es compatible, WriteClass
producirá una excepción CArchiveException
.
La clase en tiempo de ejecución debe usar DECLARE_SERIAL
y IMPLEMENT_SERIAL
; de lo contrario, WriteClass
producirá un CNotSupportedException
.
Puedes usar SerializeClass
en lugar de WriteClass
, que controla tanto la lectura como la escritura de la referencia de clase.
Ejemplo
CFile myFile(_T("My__test__file.dat"),
CFile::modeCreate | CFile::modeReadWrite);
// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);
// Store the class CAge in the archive.
arStore.WriteClass(RUNTIME_CLASS(CAge));
// Close the storing archive.
arStore.Close();
// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);
// Load a class from the archive.
CRuntimeClass *pClass = arLoad.ReadClass();
if (!pClass->IsDerivedFrom(RUNTIME_CLASS(CAge)))
{
arLoad.Abort();
}
CArchive::WriteObject
Almacena el objeto especificado CObject
en el archivo.
void WriteObject(const CObject* pOb);
Parámetros
pOb
Un puntero constante al objeto que se almacena.
Comentarios
Normalmente, se llama a esta función mediante el operador CArchive
de inserción ( <<
) sobrecargado para CObject
. WriteObject
, a su vez, llama a la función Serialize
de la clase archivada.
Debes usar la macro para habilitar el archivado IMPLEMENT_SERIAL
. WriteObject
escribe el nombre de clase ASCII en el archivo. Este nombre de clase se valida más adelante durante el proceso de carga. Un esquema de codificación especial evita la duplicación innecesaria del nombre de clase para varios objetos de la clase. Este esquema también impide el almacenamiento redundante de objetos que son destinos de más de un puntero.
El método exacto de codificación de objetos (incluida la presencia del nombre de clase ASCII) es un detalle de implementación y podría cambiar en versiones futuras de la biblioteca.
Nota:
Termina de crear, eliminar y actualizar todos los objetos antes de empezar a archivarlos. Tu archivo se dañará si mezclas el archivado con modificación de objetos.
Ejemplo
Para obtener una definición de la clase CAge
, consulta el ejemplo de CObList::CObList
.
CFile myFile(_T("My__test__file.dat"),
CFile::modeCreate | CFile::modeReadWrite);
CAge age(21), *pAge;
// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);
// Write the object to the archive
arStore.WriteObject(&age);
// Close the storing archive
arStore.Close();
// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);
// Verify the object is in the archive.
pAge = (CAge *)arLoad.ReadObject(RUNTIME_CLASS(CAge));
ASSERT(age == *pAge);
CArchive::WriteString
Usa esta función miembro para escribir datos de un búfer en el fichero asociado al objeto CArchive
.
void WriteString(LPCTSTR lpsz);
Parámetros
lpsz
Especifica un puntero a un búfer que contiene una cadena de texto terminada en NULL.
Comentarios
El carácter nulo de terminación ('\0') no se escribe en el fichero; ni es una nueva línea escrita automáticamente.
WriteString
inicia una excepción en respuesta a varias condiciones, incluida la condición de disco lleno.
Write
también está disponible, pero en lugar de terminar en un carácter nulo, escribe el número solicitado de bytes en el fichero.
Ejemplo
CFile myFile(_T("My__test__file.dat"),
CFile::modeCreate | CFile::modeReadWrite);
CString str1("String1"), str2("String2"), str;
// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);
// Write str1 and str2 to the archive
arStore.WriteString(str1);
arStore.WriteString(_T("\n"));
arStore.WriteString(str2);
arStore.WriteString(_T("\n"));
// Close the storing archive
arStore.Close();
// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);
// Verify the two strings are in the archive.
arLoad.ReadString(str);
ASSERT(str == str1);
arLoad.ReadString(str);
ASSERT(str == str2);
Vea también
Gráfico de jerarquías
CFile
(clase)
CObject
(clase)
CSocket
(clase)
CSocketFile
(clase)