La classe CArchive
Vous permet d’enregistrer un réseau complexe d’objets sous une forme binaire permanente (généralement le stockage sur disque) qui persiste une fois ces objets supprimés.
Syntaxe
class CArchive
Membres
Constructeurs publics
Nom | Description |
---|---|
CArchive::CArchive |
Crée un objet CArchive . |
Méthodes publiques
Nom | Description |
---|---|
CArchive::Abort |
Ferme une archive sans lever d’exception. |
CArchive::Close |
Vide les données non écrites et se déconnecte du CFile . |
CArchive::Flush |
Vide les données non écrites de la mémoire tampon d’archivage. |
CArchive::GetFile |
Obtient le pointeur d’objet CFile pour cette archive. |
CArchive::GetObjectSchema |
Appelé à partir de la Serialize fonction pour déterminer la version de l’objet en cours de désérialisation. |
CArchive::IsBufferEmpty |
Détermine si la mémoire tampon a été vidée pendant un processus de réception windows Sockets. |
CArchive::IsLoading |
Détermine si l’archive est chargée. |
CArchive::IsStoring |
Détermine si l’archive est en cours de stockage. |
CArchive::MapObject |
Place les objets dans la carte qui ne sont pas sérialisés dans le fichier, mais qui sont disponibles pour les sous-objets à référencer. |
CArchive::Read |
Lit les octets bruts. |
CArchive::ReadClass |
Lit une référence de classe précédemment stockée avec WriteClass . |
CArchive::ReadObject |
Appelle la fonction d’un Serialize objet pour le chargement. |
CArchive::ReadString |
Lit une seule ligne de texte. |
CArchive::SerializeClass |
Lit ou écrit la référence de classe à l’objet CArchive en fonction de la direction du CArchive . |
CArchive::SetLoadParams |
Définit la taille à laquelle le tableau de charge augmente. Doit être appelé avant le chargement ou l’appel d’un MapObject ReadObject objet. |
CArchive::SetObjectSchema |
Définit le schéma d’objet stocké dans l’objet archive. |
CArchive::SetStoreParams |
Définit la taille de la table de hachage et la taille de bloc de la carte utilisée pour identifier des objets uniques pendant le processus de sérialisation. |
CArchive::Write |
Écrit des octets bruts. |
CArchive::WriteClass |
Écrit une référence à l’objet CRuntimeClass CArchive . |
CArchive::WriteObject |
Appelle la fonction d’un Serialize objet pour le stockage. |
CArchive::WriteString |
Écrit une seule ligne de texte. |
Opérateurs publics
Nom | Description |
---|---|
CArchive::operator << |
Stocke les objets et les types primitifs dans l’archive. |
CArchive::operator >> |
Charge des objets et des types primitifs à partir de l’archive. |
Membres de données publics
Nom | Description |
---|---|
CArchive::m_pDocument |
Notes
CArchive
n’a pas de classe de base.
Plus tard, vous pouvez charger les objets à partir du stockage persistant, les reconstituer en mémoire. Ce processus de persistance des données est appelé « sérialisation ».
Vous pouvez considérer un objet archive comme un type de flux binaire. Comme un flux d’entrée/sortie, une archive est associée à un fichier et autorise l’écriture tampon et la lecture des données vers et depuis le stockage. Un flux d’entrée/sortie traite des séquences de caractères ASCII, mais une archive traite les données d’objet binaire dans un format efficace et nonundant.
Vous devez créer un CFile
objet avant de pouvoir créer un CArchive
objet. En outre, vous devez vous assurer que l’état de chargement/magasin de l’archive est compatible avec le mode d’ouverture du fichier. Vous êtes limité à une archive active par fichier.
Lorsque vous construisez un CArchive
objet, vous l’attachez à un objet de classe (ou une classe CFile
dérivée) qui représente un fichier ouvert. Vous spécifiez également si l’archive sera utilisée pour le chargement ou le stockage. Un CArchive
objet peut traiter non seulement les types primitifs, mais également les objets de CObject
classes dérivées conçues pour la sérialisation. Une classe sérialisable a généralement une Serialize
fonction membre et utilise généralement les macros et IMPLEMENT_SERIAL
les DECLARE_SERIAL
macros, comme décrit dans la classe CObject
.
Les opérateurs d’extraction surchargé ( >>
) et d’insertion () <<
sont des interfaces de programmation d’archive pratiques qui prennent en charge les types primitifs et CObject
les classes dérivées.
CArchive
prend également en charge la programmation avec les classes CSocket
Windows Sockets MFC et CSocketFile
. La IsBufferEmpty
fonction membre prend en charge cette utilisation.
Pour plus d’informations sur CArchive
, consultez les articles Sérialisation et Windows Sockets : Utilisation de sockets avec archives.
Hiérarchie d'héritage
CArchive
Spécifications
En-tête : afx.h
CArchive::Abort
Appelez cette fonction pour fermer l’archive sans lever d’exception.
void Abort ();
Notes
Le CArchive
destructeur appelle Close
normalement , qui vide toutes les données qui n’ont pas été enregistrées dans l’objet associé CFile
. Cela peut entraîner des exceptions.
Lors de l’interception de ces exceptions, il est judicieux d’utiliser Abort
, afin que la destruction de l’objet CArchive
ne provoque pas d’autres exceptions. Lors de la gestion des exceptions, CArchive::Abort
ne lève pas d’exception sur les défaillances, car, contrairement CArchive::Close
à ce qui est le cas, Abort
ignore les échecs.
Si vous avez utilisé new
pour allouer l’objet CArchive
sur le tas, vous devez le supprimer après avoir fermé le fichier.
Exemple
Consultez l’exemple pour CArchive::WriteClass
.
CArchive::CArchive
Construit un CArchive
objet et spécifie s’il sera utilisé pour le chargement ou le stockage d’objets.
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL);
Paramètres
pFile
Pointeur vers l’objet CFile
qui est la source ou la destination ultime des données persistantes.
nMode
Indicateur qui spécifie si les objets seront chargés ou stockés dans l’archive. Le nMode
paramètre doit avoir l’une des valeurs suivantes :
CArchive::load
Charge les données de l’archive. Nécessite uniquementCFile
l’autorisation de lecture.CArchive::store
Enregistre les données dans l’archive. Nécessite uneCFile
autorisation d’écriture.CArchive::bNoFlushOnDelete
Empêche l’archivage d’appelerFlush
automatiquement lorsque le destructeur d’archive est appelé. Si vous définissez cet indicateur, vous êtes responsable de l’appelClose
explicite avant que le destructeur soit appelé. Si ce n’est pas le cas, vos données seront endommagées.
nBufSize
Entier qui spécifie la taille de la mémoire tampon de fichier interne, en octets. Notez que la taille de mémoire tampon par défaut est de 4 096 octets. Si vous archivez régulièrement des objets volumineux, vous améliorerez les performances si vous utilisez une plus grande taille de mémoire tampon qui est un multiple de la taille de la mémoire tampon de fichier.
lpBuf
Pointeur facultatif vers une mémoire tampon fournie par l’utilisateur de taille nBufSize
. Si vous ne spécifiez pas ce paramètre, l’archive alloue une mémoire tampon à partir du tas local et la libère lorsque l’objet est détruit. L’archive ne libère pas une mémoire tampon fournie par l’utilisateur.
Notes
Vous ne pouvez pas modifier cette spécification après avoir créé l’archive.
Vous n’utilisez peut-être pas d’opérations CFile
pour modifier l’état du fichier tant que vous n’avez pas fermé l’archive. Toute opération de ce type endommagera l’intégrité de l’archive. Vous pouvez accéder à la position du pointeur de fichier à tout moment pendant la sérialisation en obtenant l’objet de fichier de l’archive à partir de la GetFile
fonction membre, puis en utilisant la CFile::GetPosition
fonction. Vous devez appeler CArchive::Flush
avant d’obtenir la position du pointeur de fichier.
Exemple
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
Vide toutes les données restantes dans la mémoire tampon, ferme l’archive et déconnecte l’archive du fichier.
void Close();
Notes
Aucune autre opération sur l’archive n’est autorisée. Après avoir fermé une archive, vous pouvez créer une autre archive pour le même fichier ou fermer le fichier.
La fonction Close
membre garantit que toutes les données sont transférées de l’archive vers le fichier et rendent l’archive indisponible. Pour effectuer le transfert du fichier vers le support de stockage, vous devez d’abord utiliser CFile::Close
et détruire l’objet CFile
.
Exemple
Consultez l’exemple de CArchive ::WriteString.
CArchive::Flush
Force l’écriture de toutes les données restantes dans la mémoire tampon d’archivage dans le fichier.
void Flush();
Notes
La fonction Flush
membre garantit que toutes les données sont transférées de l’archive au fichier. Vous devez appeler CFile::Close
pour terminer le transfert du fichier vers le support de stockage.
Exemple
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
Obtient le pointeur d’objet CFile
pour cette archive.
CFile* GetFile() const;
Valeur de retour
Pointeur constant vers l’objet en cours d’utilisation CFile
.
Notes
Vous devez vider l’archive avant d’utiliser GetFile
.
Exemple
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Appelez cette fonction à partir de la Serialize
fonction pour déterminer la version de l’objet actuellement désérialisé.
UINT GetObjectSchema();
Valeur de retour
Lors de la désérialisation, la version de l’objet en cours de lecture.
Notes
L’appel de cette fonction n’est valide que lorsque l’objet CArchive
est en cours de chargement ( CArchive::IsLoading
retourne non zéro). Il doit s’agir du premier appel dans la Serialize
fonction et appelé une seule fois. Une valeur de retour (UINT)-1 indique que le numéro de version est inconnu.
Une CObject
classe dérivée peut utiliser VERSIONABLE_SCHEMA
combinée (à l’aide du bit « ou » (|
)) avec la version de schéma elle-même (dans la IMPLEMENT_SERIAL
macro) pour créer un « objet pouvant être versionnable », autrement dit un objet dont Serialize
la fonction membre peut lire plusieurs versions. La fonctionnalité d’infrastructure par défaut (sans VERSIONABLE_SCHEMA
) consiste à lever une exception lorsque la version est incompatible.
Exemple
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
Appelez cette fonction membre pour déterminer si la mémoire tampon interne de l’objet archive est vide.
BOOL IsBufferEmpty() const;
Valeur de retour
Différent de zéro si la mémoire tampon de l’archive est vide ; sinon 0.
Notes
Cette fonction est fournie pour prendre en charge la programmation avec la classe CSocketFile
Windows Sockets MFC. Vous n’avez pas besoin de l’utiliser pour une archive associée à un CFile
objet.
La raison de l’utilisation IsBufferEmpty
d’une archive associée à un CSocketFile
objet est que la mémoire tampon de l’archive peut contenir plusieurs messages ou enregistrements. Après avoir reçu un message, vous devez utiliser IsBufferEmpty
pour contrôler une boucle qui continue de recevoir des données jusqu’à ce que la mémoire tampon soit vide. Pour plus d’informations, consultez la Receive
fonction membre de la classe CAsyncSocket
, qui montre comment utiliser IsBufferEmpty
.
Pour plus d’informations, consultez Windows Sockets : Utilisation de sockets avec archives.
CArchive::IsLoading
Détermine si l’archive charge les données.
BOOL IsLoading() const;
Valeur de retour
Différent de zéro si l’archive est actuellement utilisée pour le chargement ; sinon 0.
Notes
Cette fonction membre est appelée par les Serialize
fonctions des classes archivées.
Exemple
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Détermine si l’archive stocke des données.
BOOL IsStoring() const;
Valeur de retour
Différent de zéro si l’archive est actuellement utilisée pour le stockage ; sinon 0.
Notes
Cette fonction membre est appelée par les Serialize
fonctions des classes archivées.
Si l’état IsStoring
d’une archive n’est pas zéro, son IsLoading
état est 0, et vice versa.
Exemple
int i = 0;
if (ar.IsStoring())
ar << i;
else
ar >> i;
CArchive::MapObject
Appelez cette fonction membre pour placer des objets dans la carte qui ne sont pas vraiment sérialisés dans le fichier, mais qui sont disponibles pour les sous-objets à référencer.
void MapObject(const CObject* pOb);
Paramètres
pOb
Pointeur constant vers l’objet stocké.
Notes
Par exemple, vous ne sérialisez peut-être pas un document, mais vous sérialisez les éléments qui font partie du document. En appelant MapObject
, vous autorisez ces éléments ou sous-objets à référencer le document. En outre, les sous-éléments sérialisés peuvent sérialiser leur m_pDocument
pointeur arrière.
Vous pouvez appeler MapObject
quand vous stockez et chargez à partir de l’objet CArchive
. MapObject
ajoute l’objet spécifié aux structures de données internes conservées par l’objet pendant la CArchive
sérialisation et la désérialisation, mais contrairement ReadObject
à et WriteObject
, il n’appelle pas sérialiser sur l’objet.
Exemple
//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
NULL
Défini par défaut, ce pointeur vers un CDocument
peut être défini sur n’importe quel élément souhaité par l’utilisateur de l’instanceCArchive
.
CDocument* m_pDocument;
Notes
Une utilisation courante de ce pointeur consiste à transmettre des informations supplémentaires sur le processus de sérialisation à tous les objets sérialisés. Pour ce faire, initialisez le pointeur avec le document (une CDocument
classe dérivée) sérialisé, de telle sorte que les objets du document puissent accéder au document si nécessaire. Ce pointeur est également utilisé par COleClientItem
les objets lors de la sérialisation.
L’infrastructure définit m_pDocument
le document sérialisé lorsqu’un utilisateur émet une commande Ouvrir ou Enregistrer un fichier. Si vous sérialisez un document de conteneur OLE (Object Linking and Embedding) pour des raisons autres que File Open ou Save, vous devez définir m_pDocument
explicitement . Par exemple, vous devez le faire lors de la sérialisation d’un document conteneur dans le Presse-papiers.
Exemple
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 <<
Stocke l’objet ou le type primitif indiqué dans l’archive.
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);
Valeur de retour
Référence CArchive
qui active plusieurs opérateurs d’insertion sur une seule ligne.
Notes
Les deux dernières versions ci-dessus sont spécifiquement destinées au stockage d’entiers 64 bits.
Si vous avez utilisé la IMPLEMENT_SERIAL
macro dans votre implémentation de classe, l’opérateur d’insertion surchargé pour CObject
les appels protégés WriteObject
. Cette fonction appelle à son tour la Serialize
fonction de la classe.
L’opérateur d’insertion (<<
) prend en charge le CStringT
dumping de diagnostic et le stockage dans une archive.
Exemples
Cet exemple illustre l’utilisation de l’opérateur CArchive
<<
d’insertion avec les types et long
les int
types.
long l = 5;
int i = 10;
if (ar.IsStoring())
ar << l << i;
Cet exemple illustre l’utilisation de l’opérateur CArchive
<<
d’insertion avec le CStringT
type.
CString s("abc");
ar << s; // Prints the value (abc)
CArchive::operator >>
Charge l’objet ou le type primitif indiqué à partir de l’archive.
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);
Valeur de retour
Référence CArchive
qui active plusieurs opérateurs d’extraction sur une seule ligne.
Notes
Les deux dernières versions ci-dessus sont spécifiquement destinées au chargement d’entiers 64 bits.
Si vous avez utilisé la IMPLEMENT_SERIAL
macro dans votre implémentation de classe, les opérateurs d’extraction surchargés pour CObject
appeler la fonction protégée ReadObject
(avec un pointeur de classe d’exécution différent de zéro). Cette fonction appelle à son tour la Serialize
fonction de la classe.
L’opérateur d’extraction (>>
) prend en charge le CStringT
chargement à partir d’une archive.
Exemples
Cet exemple illustre l’utilisation de l’opérateur CArchive
>>
d’extraction avec le int
type.
long l;
int i;
if (ar.IsLoading())
ar >> l >> i;
Cet exemple illustre l’utilisation des CArchive
opérateurs <<
d’insertion et d’extraction et >>
avec le CStringT
type.
CString s;
if (ar.IsLoading())
ar >> s;
CArchive::Read
Lit un nombre spécifié d’octets de l’archive.
UINT Read(void* lpBuf, UINT nMax);
Paramètres
lpBuf
Pointeur vers une mémoire tampon fournie par l’utilisateur qui doit recevoir les données lues à partir de l’archive.
nMax
Entier non signé spécifiant le nombre d’octets à lire à partir de l’archive.
Valeur de retour
Entier non signé contenant le nombre d’octets réellement lus. Si la valeur de retour est inférieure au nombre demandé, la fin du fichier a été atteinte. Aucune exception n’est levée sur la condition de fin de fichier.
Notes
L’archive n’interprète pas les octets.
Vous pouvez utiliser la Read
fonction membre dans votre Serialize
fonction pour lire des structures ordinaires contenues dans vos objets.
Exemple
char pbRead[100];
ar.Read(pbRead, 100);
CArchive::ReadClass
Appelez cette fonction membre pour lire une référence à une classe précédemment stockée avec WriteClass
.
CRuntimeClass* ReadClass(
const CRuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* pObTag = NULL);
Paramètres
pClassRefRequested
Pointeur vers la CRuntimeClass
structure qui correspond à la référence de classe demandée. Peut être NULL
.
pSchema
Pointeur vers un schéma de la classe d’exécution précédemment stockée.
pObTag
Nombre qui fait référence à la balise unique d’un objet. Utilisé en interne par l’implémentation de ReadObject
. Exposé uniquement pour la programmation avancée ; pObTag
normalement doit être NULL
.
Valeur de retour
Pointeur vers la CRuntimeClass
structure.
Notes
Si pClassRefRequested
ce n’est pas NULL
le cas, ReadClass
vérifie que les informations de classe archivées sont compatibles avec votre classe runtime. S’il n’est pas compatible, ReadClass
lève un CArchiveException
.
Votre classe runtime doit utiliser DECLARE_SERIAL
et IMPLEMENT_SERIAL
; sinon, ReadClass
lève un CNotSupportedException
.
Si pSchema
c’est NULL
le cas, le schéma de la classe stockée peut être récupéré en appelant CArchive::GetObjectSchema
; sinon, *pSchema
contient le schéma de la classe d’exécution précédemment stockée.
Vous pouvez utiliser SerializeClass
au lieu de ReadClass
, qui gère à la fois la lecture et l’écriture de la référence de classe.
Exemple
Consultez l’exemple pour CArchive::WriteClass
.
CArchive::ReadObject
Lit les données d’objet de l’archive et construit un objet du type approprié.
CObject* ReadObject(const CRuntimeClass* pClass);
Paramètres
pClass
Pointeur constant vers la CRuntimeClass
structure qui correspond à l’objet que vous attendez à lire.
Valeur de retour
Pointeur CObject
qui doit être converti en toute sécurité vers la classe dérivée correcte à l’aide CObject::IsKindOf
de .
Notes
Cette fonction est normalement appelée par l’opérateur CArchive
d’extraction ( >>
) surchargé pour un CObject
pointeur. ReadObject
, à son tour, appelle la Serialize
fonction de la classe archivée.
Si vous fournissez un paramètre différent de zéro pClass
, obtenu par la RUNTIME_CLASS
macro, la fonction vérifie la classe d’exécution de l’objet archivé. Cela suppose que vous avez utilisé la IMPLEMENT_SERIAL
macro dans l’implémentation de la classe.
Exemple
Consultez l’exemple pour CArchive::WriteObject
.
CArchive::ReadString
Appelez cette fonction membre pour lire les données de texte dans une mémoire tampon à partir du fichier associé à l’objet CArchive
.
BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
Paramètres
rString
Référence à une CString
chaîne qui contiendra la chaîne résultante une fois qu’elle est lue à partir du fichier associé à l’objet CArchive
.
lpsz
Spécifie un pointeur vers une mémoire tampon fournie par l’utilisateur qui recevra une chaîne de texte terminée par null.
nMax
Spécifie le nombre maximal de caractères à lire. Doit être inférieur à la taille de la lpsz
mémoire tampon.
Valeur de retour
Dans la version qui retourne BOOL, TRUE
si elle réussit ; FALSE
sinon.
Dans la version qui retourne un LPTSTR
pointeur vers la mémoire tampon contenant les données texte ; NULL
si la fin du fichier a été atteinte.
Notes
Dans la version de la fonction membre avec le nMax
paramètre, la mémoire tampon conserve jusqu’à une limite de - nMax
1 caractères. La lecture est arrêtée par une paire d’alimentation chariot de ligne de retour. Les caractères de ligne de fin sont toujours supprimés. Un NULL
caractère ('\0') est ajouté dans les deux cas.
CArchive::Read
est également disponible pour l’entrée en mode texte, mais elle ne se termine pas sur une paire de flux de retour chariot.
Exemple
Consultez l’exemple pour CArchive::WriteString
.
CArchive::SerializeClass
Appelez cette fonction membre lorsque vous souhaitez stocker et charger les informations de version d’une classe de base.
void SerializeClass(const CRuntimeClass* pClassRef);
Paramètres
pClassRef
Pointeur vers un objet de classe run-time pour la classe de base.
Notes
SerializeClass
lit ou écrit la référence à une classe dans l’objet CArchive
, en fonction de la direction du CArchive
. Utilisez SerializeClass
à la place et WriteClass
comme moyen pratique de sérialiser des objets de classe de base ; SerializeClass
nécessite moins de ReadClass
code et moins de paramètres.
Comme ReadClass
, SerializeClass
vérifie que les informations de classe archivées sont compatibles avec votre classe runtime. S’il n’est pas compatible, SerializeClass
lève un CArchiveException
.
Votre classe runtime doit utiliser DECLARE_SERIAL
et IMPLEMENT_SERIAL
; sinon, SerializeClass
lève un CNotSupportedException
.
Utilisez la RUNTIME_CLASS
macro pour récupérer la valeur du pRuntimeClass
paramètre. La classe de base doit avoir utilisé la IMPLEMENT_SERIAL
macro.
Exemple
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
Appelez SetLoadParams
quand vous allez lire un grand nombre d’objets CObject
dérivés d’une archive.
void SetLoadParams(UINT nGrowBy = 1024);
Paramètres
nGrowBy
Nombre minimal d’emplacements d’élément à allouer si une augmentation de taille est nécessaire.
Notes
CArchive
utilise un tableau de charge pour résoudre les références aux objets stockés dans l’archive. SetLoadParams
vous permet de définir la taille à laquelle le tableau de charge augmente.
Vous ne devez pas appeler SetLoadParams
une fois qu’un objet est chargé, ou après MapObject
ou ReadObject
appelé.
Exemple
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
Appelez cette fonction membre pour définir le schéma d’objet stocké dans l’objet archive sur nSchema
.
void SetObjectSchema(UINT nSchema);
Paramètres
nSchema
Spécifie le schéma de l’objet.
Notes
L’appel suivant pour GetObjectSchema
renvoyer la valeur stockée dans nSchema
.
Utiliser SetObjectSchema
pour le contrôle de version avancé ; par exemple, lorsque vous souhaitez forcer la lecture d’une version particulière dans une Serialize
fonction d’une classe dérivée.
Exemple
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Utilisez cette méthode SetStoreParams
lors du stockage d’un grand nombre d’objets CObject
dérivés dans une archive.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Paramètres
nHashSize
Taille de la table de hachage pour les mappages de pointeur d’interface. Doit être un nombre premier.
nBlockSize
Spécifie la granularité d’allocation de mémoire pour étendre les paramètres. Doit être une puissance de 2 pour les meilleures performances.
Notes
SetStoreParams
vous permet de définir la taille de la table de hachage et la taille de bloc de la carte utilisée pour identifier des objets uniques pendant le processus de sérialisation.
Vous ne devez pas appeler SetStoreParams
une fois les objets stockés, ou après MapObject
ou WriteObject
appelé.
Exemple
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
Écrit un nombre spécifié d’octets dans l’archive.
void Write(const void* lpBuf, INT nMax);
Paramètres
lpBuf
Pointeur vers une mémoire tampon fournie par l’utilisateur qui contient les données à écrire dans l’archive.
nMax
Entier qui spécifie le nombre d’octets à écrire dans l’archive.
Notes
L’archive ne met pas en forme les octets.
Vous pouvez utiliser la Write
fonction membre dans votre Serialize
fonction pour écrire des structures ordinaires contenues dans vos objets.
Exemple
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Permet WriteClass
de stocker les informations de version et de classe d’une classe de base pendant la sérialisation de la classe dérivée.
void WriteClass(const CRuntimeClass* pClassRef);
Paramètres
pClassRef
Pointeur vers la CRuntimeClass
structure qui correspond à la référence de classe demandée.
Notes
WriteClass
écrit une référence à la CRuntimeClass
classe de base dans le CArchive
. Permet CArchive::ReadClass
de récupérer la référence.
WriteClass
vérifie que les informations de classe archivées sont compatibles avec votre classe runtime. S’il n’est pas compatible, WriteClass
lève un CArchiveException
.
Votre classe runtime doit utiliser DECLARE_SERIAL
et IMPLEMENT_SERIAL
; sinon, WriteClass
lève un CNotSupportedException
.
Vous pouvez utiliser SerializeClass
au lieu de WriteClass
, qui gère à la fois la lecture et l’écriture de la référence de classe.
Exemple
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
Stocke le fichier spécifié CObject
dans l’archive.
void WriteObject(const CObject* pOb);
Paramètres
pOb
Pointeur constant vers l’objet stocké.
Notes
Cette fonction est normalement appelée par l’opérateur CArchive
d’insertion ( <<
) surchargé pour CObject
. WriteObject
, à son tour, appelle la Serialize
fonction de la classe archivée.
Vous devez utiliser la IMPLEMENT_SERIAL
macro pour activer l’archivage. WriteObject
écrit le nom de la classe ASCII dans l’archive. Ce nom de classe est validé ultérieurement pendant le processus de chargement. Un schéma d’encodage spécial empêche la duplication inutile du nom de classe pour plusieurs objets de la classe. Ce schéma empêche également le stockage redondant d’objets cibles de plusieurs pointeurs.
La méthode d’encodage d’objet exacte (y compris la présence du nom de classe ASCII) est un détail d’implémentation et peut changer dans les futures versions de la bibliothèque.
Remarque
Terminez la création, la suppression et la mise à jour de tous vos objets avant de commencer à les archiver. Votre archive est endommagée si vous mélangez l’archivage avec la modification de l’objet.
Exemple
Pour obtenir une définition de la classe CAge
, consultez l’exemple pour 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
Utilisez cette fonction membre pour écrire des données d’une mémoire tampon dans le fichier associé à l’objet CArchive
.
void WriteString(LPCTSTR lpsz);
Paramètres
lpsz
Spécifie un pointeur vers une mémoire tampon contenant une chaîne de texte terminée par null.
Notes
Le caractère null de fin ('\0') n’est pas écrit dans le fichier ; ni n’est-ce qu’une ligne de nouvelle ligne automatiquement écrite.
WriteString
lève une exception en réponse à plusieurs conditions, y compris la condition complète du disque.
Write
est également disponible, mais plutôt que de terminer sur un caractère Null, il écrit le nombre demandé d’octets dans le fichier.
Exemple
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);
Voir aussi
Graphique hiérarchique
CFile
Classe
CObject
Classe
CSocket
Classe
CSocketFile
Classe