Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Hiermee kunt u een complex netwerk van objecten opslaan in een permanente binaire vorm (meestal schijfopslag) die behouden blijft nadat deze objecten zijn verwijderd.
Syntaxis
class CArchive
Leden
Openbare constructors
| Naam | Beschrijving |
|---|---|
CArchive::CArchive |
Hiermee maakt u een CArchive-object. |
Openbare methoden
| Naam | Beschrijving |
|---|---|
CArchive::Abort |
Hiermee sluit u een archief zonder een uitzondering te genereren. |
CArchive::Close |
Verwijdert ongeschreven gegevens en verbreekt de verbinding met de CFile. |
CArchive::Flush |
Verwijdert ongeschreven gegevens uit de archiefbuffer. |
CArchive::GetFile |
Hiermee haalt u de CFile objectpointer voor dit archief op. |
CArchive::GetObjectSchema |
Aangeroepen vanuit de Serialize functie om te bepalen welke versie van het object wordt gedeserialiseerd. |
CArchive::IsBufferEmpty |
Bepaalt of de buffer is geleegd tijdens een Ontvangstproces van Windows Sockets. |
CArchive::IsLoading |
Bepaalt of het archief wordt geladen. |
CArchive::IsStoring |
Bepaalt of het archief wordt opgeslagen. |
CArchive::MapObject |
Hiermee plaatst u objecten in de kaart die niet naar het bestand zijn geserialiseerd, maar die beschikbaar zijn voor subobjecten waarnaar moet worden verwezen. |
CArchive::Read |
Leest onbewerkte bytes. |
CArchive::ReadClass |
Leest een klassereferentie die eerder is opgeslagen met WriteClass. |
CArchive::ReadObject |
Roept de functie van Serialize een object aan voor het laden. |
CArchive::ReadString |
Leest één regel tekst. |
CArchive::SerializeClass |
Leest of schrijft de klasseverwijzing naar het CArchive object, afhankelijk van de richting van de CArchive. |
CArchive::SetLoadParams |
Hiermee stelt u de grootte in waarop de loadmatrix groeit. Moet worden aangeroepen voordat een object wordt geladen of vóór MapObject of ReadObject wordt aangeroepen. |
CArchive::SetObjectSchema |
Hiermee stelt u het objectschema in dat is opgeslagen in het archiefobject. |
CArchive::SetStoreParams |
Hiermee stelt u de grootte van de hashtabel en de blokgrootte van de kaart in die wordt gebruikt om unieke objecten te identificeren tijdens het serialisatieproces. |
CArchive::Write |
Schrijft onbewerkte bytes. |
CArchive::WriteClass |
Hiermee schrijft u een verwijzing naar de naar de CRuntimeClassCArchive. |
CArchive::WriteObject |
Roept de functie van Serialize een object aan voor het opslaan. |
CArchive::WriteString |
Hiermee schrijft u één regel tekst. |
Openbare operators
| Naam | Beschrijving |
|---|---|
CArchive::operator << |
Hiermee worden objecten en primitieve typen opgeslagen in het archief. |
CArchive::operator >> |
Hiermee worden objecten en primitieve typen uit het archief geladen. |
Leden van openbare gegevens
| Naam | Beschrijving |
|---|---|
CArchive::m_pDocument |
Opmerkingen
CArchive heeft geen basisklasse.
Later kunt u de objecten laden vanuit permanente opslag, waarbij u ze opnieuw in het geheugen opstelt. Dit proces voor het persistent maken van gegevens wordt 'serialisatie' genoemd.
U kunt een archiefobject beschouwen als een soort binaire stroom. Net als een invoer-/uitvoerstroom wordt een archief gekoppeld aan een bestand en kan het gebufferde schrijven en lezen van gegevens naar en van opslag worden toegestaan. Een invoer-/uitvoerstroom verwerkt reeksen ASCII-tekens, maar een archief verwerkt binaire objectgegevens in een efficiënte, niet-redundante indeling.
U moet een CFile object maken voordat u een CArchive object kunt maken. Bovendien moet u ervoor zorgen dat de laad-/archiefstatus van het archief compatibel is met de geopende modus van het bestand. U bent beperkt tot één actief archief per bestand.
Wanneer u een CArchive object maakt, koppelt u het aan een object van klasse CFile (of een afgeleide klasse) dat een geopend bestand vertegenwoordigt. U geeft ook op of het archief wordt gebruikt voor het laden of opslaan. Een CArchive object kan niet alleen primitieve typen verwerken, maar ook objecten van CObject-afgeleide klassen die zijn ontworpen voor serialisatie. Een serialiseerbare klasse heeft meestal een Serialize lidfunctie en gebruikt meestal de DECLARE_SERIAL en IMPLEMENT_SERIAL macro's, zoals beschreven onder klasse CObject.
De operators voor overbelaste extractie (>>) en invoeging (<<) zijn handige archiefprogrammeerinterfaces die zowel primitieve typen als CObject-afgeleide klassen ondersteunen.
CArchive ondersteunt ook programmeren met de MFC Windows Sockets-klassen CSocket en CSocketFile. De IsBufferEmpty lidfunctie ondersteunt dat gebruik.
Zie de artikelen CArchive en Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
Overnamehiërarchie
CArchive
Behoeften
koptekst:afx.h
CArchive::Abort
Roep deze functie aan om het archief te sluiten zonder een uitzondering te genereren.
void Abort ();
Opmerkingen
De CArchive destructor roept normaal gesproken Closeaan, waardoor alle gegevens die niet zijn opgeslagen in het bijbehorende CFile object worden leeggemaakt. Dit kan uitzonderingen veroorzaken.
Bij het ondervangen van deze uitzonderingen is het een goed idee om het object te gebruiken Abort, zodat het CArchive object geen verdere uitzonderingen veroorzaakt. Bij het afhandelen van uitzonderingen wordt er geen uitzondering op fouten gegenereerd, CArchive::Abort omdat in tegenstelling tot CArchive::Closefouten Abort fouten worden genegeerd.
Als u new het CArchive object aan de heap hebt toegewezen, moet u het verwijderen nadat u het bestand hebt gesloten.
Voorbeeld
Zie het voorbeeld voor CArchive::WriteClass.
CArchive::CArchive
Hiermee maakt u een CArchive object en geeft u op of het wordt gebruikt voor het laden of opslaan van objecten.
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL);
Parameterwaarden
pFile
Een aanwijzer naar het CFile object dat de ultieme bron of bestemming van de permanente gegevens is.
nMode
Een vlag die aangeeft of objecten worden geladen van of opgeslagen in het archief. De nMode parameter moet een van de volgende waarden hebben:
CArchive::loadLaadt gegevens uit het archief. Hiervoor is alleenCFileleesmachtiging vereist.CArchive::storeHiermee worden gegevens opgeslagen in het archief. Hiervoor is schrijfmachtiging vereistCFile.CArchive::bNoFlushOnDeleteHiermee voorkomt u dat het archief automatisch wordt aangeroepenFlushwanneer de archiefdestructor wordt aangeroepen. Als u deze vlag instelt, bent u verantwoordelijk voor het expliciet aanroepen voordat de destructor wordt aangeroepenClose. Als u dat niet doet, zijn uw gegevens beschadigd.
nBufSize
Een geheel getal dat de grootte van de interne bestandsbuffer in bytes aangeeft. Houd er rekening mee dat de standaardbuffergrootte 4096 bytes is. Als u regelmatig grote objecten archiveert, verbetert u de prestaties als u een grotere buffergrootte gebruikt die een veelvoud is van de bestandsgrootte.
lpBuf
Een optionele aanwijzer naar een door de gebruiker geleverde buffer van grootte nBufSize. Als u deze parameter niet opgeeft, wijst het archief een buffer toe vanuit de lokale heap en maakt het vrij wanneer het object wordt vernietigd. Het archief maakt geen door de gebruiker geleverde buffer vrij.
Opmerkingen
U kunt deze specificatie niet wijzigen nadat u het archief hebt gemaakt.
U mag bewerkingen niet gebruiken CFile om de status van het bestand te wijzigen totdat u het archief hebt gesloten. Een dergelijke bewerking zal de integriteit van het archief beschadigen. U kunt de positie van de bestandsaanwijzer op elk gewenst moment tijdens de serialisatie openen door het bestandsobject van het archief te verkrijgen van de GetFile lidfunctie en vervolgens de CFile::GetPosition functie te gebruiken. U moet aanroepen CArchive::Flush voordat u de positie van de bestandsaanwijzer verkrijgt.
Voorbeeld
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
Hiermee worden alle resterende gegevens in de buffer leeggemaakt, het archief gesloten en wordt het archief losgekoppeld van het bestand.
void Close();
Opmerkingen
Er zijn geen verdere bewerkingen op het archief toegestaan. Nadat u een archief hebt gesloten, kunt u een ander archief voor hetzelfde bestand maken of kunt u het bestand sluiten.
De lidfunctie Close zorgt ervoor dat alle gegevens van het archief naar het bestand worden overgebracht en dat het archief niet beschikbaar is. Als u de overdracht van het bestand naar het opslagmedium wilt voltooien, moet u eerst het object gebruiken CFile::Close en vervolgens CFile vernietigen.
Voorbeeld
Zie het voorbeeld voor CArchive::WriteString.
CArchive::Flush
Dwingt eventuele gegevens die in de archiefbuffer blijven, naar het bestand te worden geschreven.
void Flush();
Opmerkingen
De lidfunctie Flush zorgt ervoor dat alle gegevens vanuit het archief naar het bestand worden overgebracht. U moet aanroepen CFile::Close om de overdracht van het bestand naar het opslagmedium te voltooien.
Voorbeeld
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
Hiermee haalt u de CFile objectpointer voor dit archief op.
CFile* GetFile() const;
Retourwaarde
Een constante aanwijzer naar het CFile object dat wordt gebruikt.
Opmerkingen
U moet het archief leegmaken voordat u het gebruikt GetFile.
Voorbeeld
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Roep deze functie aan vanuit de Serialize functie om de versie te bepalen van het object dat momenteel wordt gedeserialiseerd.
UINT GetObjectSchema();
Retourwaarde
Tijdens de deserialisatie wordt de versie van het object gelezen.
Opmerkingen
Het aanroepen van deze functie is alleen geldig wanneer het CArchive object wordt geladen ( CArchive::IsLoading retourneert niet-nul). Dit moet de eerste aanroep in de Serialize functie zijn en slechts één keer worden aangeroepen. Een retourwaarde van (UINT)-1 geeft aan dat het versienummer onbekend is.
Een CObject-afgeleide klasse kan gecombineerd (met bitwise 'or' (VERSIONABLE_SCHEMA)) gebruiken met de schemaversie zelf (in de | macro) om een 'versiebaar object' te maken, dat wil gezegdIMPLEMENT_SERIAL, een object waarvan Serialize de lidfunctie meerdere versies kan lezen. De standaardframeworkfunctionaliteit (zonder VERSIONABLE_SCHEMA) is het genereren van een uitzondering wanneer de versie niet overeenkomt.
Voorbeeld
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
Roep deze lidfunctie aan om te bepalen of de interne buffer van het archiefobject leeg is.
BOOL IsBufferEmpty() const;
Retourwaarde
Niet-nul als de buffer van het archief leeg is; anders 0.
Opmerkingen
Deze functie wordt geleverd ter ondersteuning van programmeren met de MFC Windows Sockets-klasse CSocketFile. U hoeft deze niet te gebruiken voor een archief dat is gekoppeld aan een CFile object.
De reden voor het gebruik IsBufferEmpty van een archief dat is gekoppeld aan een CSocketFile object, is dat de buffer van het archief meer dan één bericht of record kan bevatten. Nadat u één bericht hebt ontvangen, moet u een lus beheren IsBufferEmpty die gegevens blijft ontvangen totdat de buffer leeg is. Zie de Receive lidfunctie van klasse CAsyncSocketvoor meer informatie, die laat zien hoe u deze kunt gebruiken IsBufferEmpty.
Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.
CArchive::IsLoading
Bepaalt of het archief gegevens laadt.
BOOL IsLoading() const;
Retourwaarde
Niet-nul als het archief momenteel wordt gebruikt voor het laden; anders 0.
Opmerkingen
Deze lidfunctie wordt aangeroepen door de Serialize functies van de gearchiveerde klassen.
Voorbeeld
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Bepaalt of het archief gegevens opslaat.
BOOL IsStoring() const;
Retourwaarde
Niet-nul als het archief momenteel wordt gebruikt voor opslag; anders 0.
Opmerkingen
Deze lidfunctie wordt aangeroepen door de Serialize functies van de gearchiveerde klassen.
Als de status van een archief niet-nul is, IsStoring is de IsLoading status 0 en omgekeerd.
Voorbeeld
int i = 0;
if (ar.IsStoring())
ar << i;
else
ar >> i;
CArchive::MapObject
Roep deze lidfunctie aan om objecten in de kaart te plaatsen die niet echt naar het bestand zijn geserialiseerd, maar die beschikbaar zijn voor subobjecten waarnaar kan worden verwezen.
void MapObject(const CObject* pOb);
Parameterwaarden
pOb
Een constante aanwijzer naar het object dat wordt opgeslagen.
Opmerkingen
U kunt bijvoorbeeld een document niet serialiseren, maar de items die deel uitmaken van het document serialiseren. Door aan te roepen MapObject, staat u deze items of subobjecten toe om naar het document te verwijzen. Bovendien kunnen geserialiseerde subitems de m_pDocument backpointer serialiseren.
U kunt aanroepen MapObject wanneer u het object opslaat en laadt CArchive .
MapObject voegt het opgegeven object toe aan de interne gegevensstructuren die door het CArchive object worden onderhouden tijdens serialisatie en deserialisatie, maar in tegenstelling tot ReadObject en WriteObject, wordt het object niet geserialiseerd.
Voorbeeld
//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 Deze aanwijzer CDocument kan standaard worden ingesteld op alles wat de gebruiker van het CArchive exemplaar wil.
CDocument* m_pDocument;
Opmerkingen
Een veelvoorkomend gebruik van deze aanwijzer is om aanvullende informatie over het serialisatieproces over te brengen op alle objecten die worden geserialiseerd. Dit wordt bereikt door de aanwijzer te initialiseren met het document (een CDocument-afgeleide klasse) die wordt geserialiseerd, zodat objecten in het document zo nodig toegang hebben tot het document. Deze aanwijzer wordt ook gebruikt door COleClientItem objecten tijdens serialisatie.
Het framework wordt ingesteld m_pDocument op het document dat wordt geserialiseerd wanneer een gebruiker een opdracht Bestand openen of Opslaan uitgeeft. Als u een OLE-containerdocument (Object Linking and Embedding) serialiseert om andere redenen dan Bestand openen of Opslaan, moet u expliciet instellen m_pDocument. U doet dit bijvoorbeeld wanneer u een containerdocument serialiseert naar het Klembord.
Voorbeeld
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 <<
Slaat het aangegeven object of primitief type op in het archief.
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);
Retourwaarde
Een CArchive verwijzing die meerdere invoegoperators op één regel mogelijk maakt.
Opmerkingen
De laatste twee versies hierboven zijn specifiek bedoeld voor het opslaan van 64-bits gehele getallen.
Als u de IMPLEMENT_SERIAL macro in uw klasse-implementatie hebt gebruikt, wordt de invoegoperator overbelast voor CObject aanroepen van de beveiligde WriteObject. Met deze functie wordt op zijn beurt de Serialize functie van de klasse aangeroepen.
De CStringT invoegoperator (<<) ondersteunt diagnostische dumping en opslag in een archief.
Voorbeelden
In dit voorbeeld ziet u het gebruik van de CArchive invoegoperator << met de int en long typen.
long l = 5;
int i = 10;
if (ar.IsStoring())
ar << l << i;
In dit voorbeeld ziet u het gebruik van de CArchive invoegoperator << met het CStringT type.
CString s("abc");
ar << s; // Prints the value (abc)
CArchive::operator >>
Laadt het aangegeven object of primitieve type uit het archief.
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);
Retourwaarde
Een CArchive verwijzing die meerdere extractieoperators op één regel mogelijk maakt.
Opmerkingen
De laatste twee versies hierboven zijn specifiek bedoeld voor het laden van 64-bits gehele getallen.
Als u de IMPLEMENT_SERIAL macro in uw klasse-implementatie hebt gebruikt, worden de operatoren voor extractie overbelast om CObject de beveiligde ReadObject functie aan te roepen (met een niet-zero-runtime class pointer). Met deze functie wordt op zijn beurt de Serialize functie van de klasse aangeroepen.
De CStringT extractieoperator (>>) ondersteunt het laden vanuit een archief.
Voorbeelden
In dit voorbeeld ziet u het gebruik van de CArchive extractieoperator >> met het int type.
long l;
int i;
if (ar.IsLoading())
ar >> l >> i;
In dit voorbeeld ziet u het gebruik van de CArchive invoeg- en extractieoperators << en >> met het CStringT type.
CString s;
if (ar.IsLoading())
ar >> s;
CArchive::Read
Hiermee wordt een opgegeven aantal bytes uit het archief gelezen.
UINT Read(void* lpBuf, UINT nMax);
Parameterwaarden
lpBuf
Een aanwijzer naar een door de gebruiker opgegeven buffer die de gegevens uit het archief moet ontvangen.
nMax
Een geheel getal zonder teken waarmee het aantal bytes wordt opgegeven dat uit het archief moet worden gelezen.
Retourwaarde
Een geheel getal zonder teken dat het aantal bytes bevat dat daadwerkelijk wordt gelezen. Als de retourwaarde kleiner is dan het aangevraagde aantal, is het einde van het bestand bereikt. Er wordt geen uitzondering gegenereerd op basis van de voorwaarde voor het einde van het bestand.
Opmerkingen
Het archief interpreteert de bytes niet.
U kunt de lidfunctie in uw Read functie gebruiken voor het Serialize lezen van gewone structuren die zich in uw objecten bevinden.
Voorbeeld
char pbRead[100];
ar.Read(pbRead, 100);
CArchive::ReadClass
Roep deze lidfunctie aan om een verwijzing te lezen naar een klasse die eerder is opgeslagen met WriteClass.
CRuntimeClass* ReadClass(
const CRuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* pObTag = NULL);
Parameterwaarden
pClassRefRequested
Een aanwijzer naar de CRuntimeClass structuur die overeenkomt met de gevraagde klassereferentie. Kan zijn NULL.
pSchema
Een aanwijzer naar een schema van de runtimeklasse die eerder is opgeslagen.
pObTag
Een getal dat verwijst naar de unieke tag van een object. Intern gebruikt door de implementatie van ReadObject. Alleen beschikbaar gesteld voor geavanceerde programmering; pObTag normaal gesproken zou moeten zijn NULL.
Retourwaarde
Een aanwijzer naar de CRuntimeClass structuur.
Opmerkingen
Als pClassRefRequested dat niet NULLhet is, ReadClass controleert u of de gearchiveerde klasse-informatie compatibel is met uw runtimeklasse. Als het niet compatibel is, ReadClass werpt u een CArchiveException.
Uw runtimeklasse moet worden gebruikt DECLARE_SERIAL en IMPLEMENT_SERIALanders ReadClass wordt er een CNotSupportedException.
Als pSchema dat het is NULL, kan het schema van de opgeslagen klasse worden opgehaald door aan te roepen CArchive::GetObjectSchema; anders bevat het *pSchema schema van de runtimeklasse die eerder is opgeslagen.
U kunt SerializeClass in plaats van ReadClass, die zowel het lezen als schrijven van de klasreferentie afhandelt.
Voorbeeld
Zie het voorbeeld voor CArchive::WriteClass.
CArchive::ReadObject
Hiermee worden objectgegevens uit het archief gelezen en wordt een object van het juiste type samengesteld.
CObject* ReadObject(const CRuntimeClass* pClass);
Parameterwaarden
pClass
Een constante aanwijzer naar de CRuntimeClass structuur die overeenkomt met het object dat u verwacht te lezen.
Retourwaarde
Een CObject aanwijzer die veilig moet worden gecast naar de juiste afgeleide klasse met behulp van CObject::IsKindOf.
Opmerkingen
Deze functie wordt normaal gesproken aangeroepen door de CArchive extractieoperator (>>) overbelast voor een CObject aanwijzer.
ReadObjectroept op zijn beurt de Serialize functie van de gearchiveerde klasse aan.
Als u een niet-nulparameter pClass opgeeft, die wordt verkregen door de RUNTIME_CLASS macro, controleert de functie de runtimeklasse van het gearchiveerde object. Hierbij wordt ervan uitgegaan dat u de IMPLEMENT_SERIAL macro hebt gebruikt in de implementatie van de klasse.
Voorbeeld
Zie het voorbeeld voor CArchive::WriteObject.
CArchive::ReadString
Roep deze lidfunctie aan om tekstgegevens te lezen in een buffer uit het bestand dat aan het CArchive object is gekoppeld.
BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
Parameterwaarden
rString
Een verwijzing naar een CString bestand dat de resulterende tekenreeks bevat nadat deze is gelezen uit het bestand dat aan het CArchive object is gekoppeld.
lpsz
Hiermee geeft u een aanwijzer op naar een door de gebruiker opgegeven buffer die een door de gebruiker beëindigde teksttekenreeks ontvangt.
nMax
Hiermee geeft u het maximum aantal tekens op dat moet worden gelezen. Moet één kleiner zijn dan de grootte van de lpsz buffer.
Retourwaarde
In de versie die BOOL retourneert, indien geslaagd; TRUEFALSE anders.
In de versie die een LPTSTR, een aanwijzer naar de buffer met de tekstgegevens retourneert; NULL als het einde van het bestand is bereikt.
Opmerkingen
In de versie van de lidfunctie met de nMax parameter heeft de buffer een limiet van nMax - 1 tekens. Lezen wordt gestopt door een regelterugloopfeedpaar. Volgtekens van nieuwe regels worden altijd verwijderd. In NULL beide gevallen wordt een teken (\0) toegevoegd.
CArchive::Read is ook beschikbaar voor invoer in de tekstmodus, maar wordt niet beëindigd op een regelterugloopfeedpaar.
Voorbeeld
Zie het voorbeeld voor CArchive::WriteString.
CArchive::SerializeClass
Roep deze lidfunctie aan wanneer u de versiegegevens van een basisklasse wilt opslaan en laden.
void SerializeClass(const CRuntimeClass* pClassRef);
Parameterwaarden
pClassRef
Een aanwijzer naar een runtimeklasseobject voor de basisklasse.
Opmerkingen
SerializeClass leest of schrijft de verwijzing naar een klasse naar het CArchive object, afhankelijk van de richting van het CArchiveobject. Gebruik SerializeClass in plaats van ReadClass en WriteClass als een handige manier om objecten van basisklassen te serialiseren. SerializeClass Hiervoor zijn minder code en minder parameters vereist.
ReadClass Controleert bijvoorbeeld SerializeClassof de gearchiveerde klasse-informatie compatibel is met uw runtimeklasse. Als het niet compatibel is, SerializeClass werpt u een CArchiveException.
Uw runtimeklasse moet worden gebruikt DECLARE_SERIAL en IMPLEMENT_SERIALanders SerializeClass wordt er een CNotSupportedException.
Gebruik de RUNTIME_CLASS macro om de waarde voor de pRuntimeClass parameter op te halen. De basisklasse moet de IMPLEMENT_SERIAL macro hebben gebruikt.
Voorbeeld
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
Aanroepen SetLoadParams wanneer u een groot aantal CObject-afgeleide objecten uit een archief gaat lezen.
void SetLoadParams(UINT nGrowBy = 1024);
Parameterwaarden
nGrowBy
Het minimum aantal elementsleuven dat moet worden toegewezen als een grootteverhoging nodig is.
Opmerkingen
CArchive maakt gebruik van een load array om verwijzingen naar objecten op te lossen die zijn opgeslagen in het archief.
SetLoadParams hiermee kunt u de grootte instellen waarop de belastingmatrix groeit.
U mag geen aanroepen SetLoadParams nadat een object is geladen of nadat MapObject of ReadObject wordt aangeroepen.
Voorbeeld
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
Roep deze lidfunctie aan om het objectschema in te stellen dat is opgeslagen in het archiefobject op nSchema.
void SetObjectSchema(UINT nSchema);
Parameterwaarden
nSchema
Hiermee geeft u het schema van het object.
Opmerkingen
Met de volgende aanroep GetObjectSchema wordt de waarde geretourneerd die is opgeslagen in nSchema.
Gebruik SetObjectSchema deze functie voor geavanceerde versiebeheer. Als u bijvoorbeeld wilt afdwingen dat een bepaalde versie wordt gelezen in een Serialize functie van een afgeleide klasse.
Voorbeeld
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Gebruik SetStoreParams deze functie bij het opslaan van een groot aantal CObject-afgeleide objecten in een archief.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Parameterwaarden
nHashSize
De grootte van de hash-tabel voor interfacepointertoewijzingen. Moet een priemnummer zijn.
nBlockSize
Hiermee geeft u de granulariteit voor geheugentoewijzing voor het uitbreiden van de parameters. Moet een vermogen van 2 zijn voor de beste prestaties.
Opmerkingen
SetStoreParams hiermee kunt u de grootte van de hash-tabel en de blokgrootte van de kaart instellen die wordt gebruikt om unieke objecten te identificeren tijdens het serialisatieproces.
U mag niet aanroepen SetStoreParams nadat objecten zijn opgeslagen, of na MapObject of WriteObject wordt aangeroepen.
Voorbeeld
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
Hiermee schrijft u een opgegeven aantal bytes naar het archief.
void Write(const void* lpBuf, INT nMax);
Parameterwaarden
lpBuf
Een aanwijzer naar een door de gebruiker geleverde buffer die de gegevens bevat die naar het archief moeten worden geschreven.
nMax
Een geheel getal dat het aantal bytes aangeeft dat naar het archief moet worden geschreven.
Opmerkingen
Het archief maakt de bytes niet op.
U kunt de Write lidfunctie in uw Serialize functie gebruiken om gewone structuren te schrijven die zich in uw objecten bevinden.
Voorbeeld
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Gebruik WriteClass deze optie om de versie- en klassegegevens van een basisklasse op te slaan tijdens de serialisatie van de afgeleide klasse.
void WriteClass(const CRuntimeClass* pClassRef);
Parameterwaarden
pClassRef
Een aanwijzer naar de CRuntimeClass structuur die overeenkomt met de gevraagde klassereferentie.
Opmerkingen
WriteClass schrijft een verwijzing naar de CRuntimeClass basisklasse naar de CArchive. Gebruik CArchive::ReadClass dit om de verwijzing op te halen.
WriteClass Controleert of de gearchiveerde klasse-informatie compatibel is met uw runtimeklasse. Als het niet compatibel is, WriteClass werpt u een CArchiveException.
Uw runtimeklasse moet worden gebruikt DECLARE_SERIAL en IMPLEMENT_SERIALanders WriteClass wordt er een CNotSupportedException.
U kunt SerializeClass in plaats van WriteClass, die zowel het lezen als schrijven van de klasreferentie afhandelt.
Voorbeeld
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
Slaat de opgegeven CObject waarde op in het archief.
void WriteObject(const CObject* pOb);
Parameterwaarden
pOb
Een constante aanwijzer naar het object dat wordt opgeslagen.
Opmerkingen
Deze functie wordt normaal gesproken aangeroepen door de CArchive invoegoperator (<<) overbelast voor CObject.
WriteObjectroept op zijn beurt de Serialize functie van de gearchiveerde klasse aan.
U moet de IMPLEMENT_SERIAL macro gebruiken om archivering in te schakelen.
WriteObject schrijft de naam van de ASCII-klasse naar het archief. Deze klassenaam wordt later tijdens het laadproces gevalideerd. Een speciaal coderingsschema voorkomt onnodige duplicatie van de klassenaam voor meerdere objecten van de klasse. Dit schema voorkomt ook redundante opslag van objecten die doelen zijn van meer dan één aanwijzer.
De exacte objectcoderingsmethode (inclusief de aanwezigheid van de ASCII-klassenaam) is een implementatiedetail en kan in toekomstige versies van de bibliotheek veranderen.
Opmerking
Voltooi het maken, verwijderen en bijwerken van al uw objecten voordat u ze gaat archiveren. Uw archief is beschadigd als u archivering combineert met objectwijziging.
Voorbeeld
Zie het voorbeeld voor CAgeeen definitie van de klasseCObList::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
Gebruik deze lidfunctie om gegevens van een buffer te schrijven naar het bestand dat aan het CArchive object is gekoppeld.
void WriteString(LPCTSTR lpsz);
Parameterwaarden
lpsz
Hiermee geeft u een aanwijzer op naar een buffer met een tekenreeks die null-beëindigde tekst bevat.
Opmerkingen
Het afsluitende null-teken (\0) wordt niet naar het bestand geschreven; evenmin is er automatisch een nieuwe regel geschreven.
WriteString genereert een uitzondering als reactie op verschillende voorwaarden, met inbegrip van de schijf-volledige voorwaarde.
Write is ook beschikbaar, maar in plaats van te beëindigen op een null-teken, wordt het aangevraagde aantal bytes naar het bestand geschreven.
Voorbeeld
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);
Zie ook
Hiërarchiegrafiek
CFile klasse
CObject klasse
CSocket klasse
CSocketFile klasse