CArchive
Třída
Umožňuje uložit složitou síť objektů v trvalé binární podobě (obvykle diskové úložiště), která po odstranění těchto objektů přetrvává.
Syntaxe
class CArchive
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CArchive::CArchive |
CArchive Vytvoří objekt. |
Veřejné metody
Název | Popis |
---|---|
CArchive::Abort |
Zavře archiv bez vyvolání výjimky. |
CArchive::Close |
Vyprázdní nepřepsaná data a odpojí se od objektu CFile . |
CArchive::Flush |
Vyprázdní nepřepsaná data z archivní vyrovnávací paměti. |
CArchive::GetFile |
Získá ukazatel objektu CFile pro tento archiv. |
CArchive::GetObjectSchema |
Volané z Serialize funkce k určení verze objektu, který je deserializován. |
CArchive::IsBufferEmpty |
Určuje, zda byla vyrovnávací paměť vyprázdněna během procesu příjmu rozhraní Windows Sockets. |
CArchive::IsLoading |
Určuje, zda se archiv načítá. |
CArchive::IsStoring |
Určuje, zda se archiv ukládá. |
CArchive::MapObject |
Umístí objekty do mapy, které nejsou serializovány do souboru, ale jsou k dispozici pro podobjekty odkazované. |
CArchive::Read |
Čte nezpracované bajty. |
CArchive::ReadClass |
Přečte odkaz na třídu, který byl dříve uložen s WriteClass . |
CArchive::ReadObject |
Volá funkci objektu Serialize pro načtení. |
CArchive::ReadString |
Přečte jeden řádek textu. |
CArchive::SerializeClass |
Čte nebo zapisuje odkaz třídy na CArchive objekt v závislosti na směru objektu CArchive . |
CArchive::SetLoadParams |
Nastaví velikost, na kterou se pole zatížení zvětšuje. Musí být volána před načtením nebo před MapObject načtením objektu nebo před nebo ReadObject je volána. |
CArchive::SetObjectSchema |
Nastaví schéma objektů uložené v archivačním objektu. |
CArchive::SetStoreParams |
Nastaví velikost tabulky hash a velikost bloku mapy použité k identifikaci jedinečných objektů během procesu serializace. |
CArchive::Write |
Zapisuje nezpracované bajty. |
CArchive::WriteClass |
Zapíše odkaz na odkaz na CRuntimeClass .CArchive |
CArchive::WriteObject |
Volá funkci objektu Serialize pro ukládání. |
CArchive::WriteString |
Zapíše jeden řádek textu. |
Veřejné operátory
Název | Popis |
---|---|
CArchive::operator << |
Ukládá objekty a primitivní typy do archivu. |
CArchive::operator >> |
Načte objekty a primitivní typy z archivu. |
Veřejné datové členy
Název | Popis |
---|---|
CArchive::m_pDocument |
Poznámky
CArchive
nemá základní třídu.
Později můžete objekty načíst z trvalého úložiště a rekonstituovat je v paměti. Tento proces vytváření trvalých dat se nazývá serializace.
Archivní objekt si můžete představit jako druh binárního streamu. Stejně jako vstupní/výstupní datový proud je archiv přidružený k souboru a umožňuje ukládání dat do a z úložiště ukládat do vyrovnávací paměti a číst je. Vstupní/výstupní datový proud zpracovává sekvence znaků ASCII, ale archiv zpracovává data binárních objektů v efektivním neredundant formátu.
Před vytvořením CArchive
objektu CFile
je nutné vytvořit objekt. Kromě toho musíte zajistit, aby byl stav načítání a úložiště archivu kompatibilní s režimem otevření souboru. Počet aktivních archivů na soubor je omezený.
Při vytváření objektu CArchive
jej připojíte k objektu třídy CFile
(nebo odvozené třídy), který představuje otevřený soubor. Určíte také, jestli se archiv použije k načítání nebo ukládání. Objekt CArchive
může zpracovávat nejen primitivní typy, ale také objekty -odvozených tříd určených CObject
pro serializaci. Serializovatelná třída má obvykle členská Serialize
funkce a obvykle používá DECLARE_SERIAL
a IMPLEMENT_SERIAL
makra, jak je popsáno v rámci třídy CObject
.
Operátory přetížené extrakce () a vložení (>>
<<
) jsou praktická archivní programovací rozhraní, která podporují primitivní typy i CObject
odvozené třídy.
CArchive
podporuje také programování pomocí tříd CSocket
rozhraní WINDOWS Sockets mfc a CSocketFile
. Členová IsBufferEmpty
funkce toto použití podporuje.
Další informace o CArchive
, naleznete v článcích Serializace a Windows Sockets: Použití soketů s archivy.
Hierarchie dědičnosti
CArchive
Požadavky
Záhlaví: afx.h
CArchive::Abort
Voláním této funkce zavřete archiv bez vyvolání výjimky.
void Abort ();
Poznámky
Destruktor CArchive
bude normálně volat Close
, což vyprázdní všechna data, která nebyla uložena do přidruženého CFile
objektu. To může způsobit výjimky.
Při zachytávání těchto výjimek je vhodné použít Abort
, aby destrukce CArchive
objektu nezpůsobila další výjimky. Při zpracování výjimek nevyvolá výjimku při selhání, CArchive::Abort
protože na rozdíl od CArchive::Close
, Abort
ignoruje selhání.
Pokud jste objekt new
přidělil CArchive
na haldě, musíte ho po zavření souboru odstranit.
Příklad
Podívejte se na příklad pro CArchive::WriteClass
.
CArchive::CArchive
CArchive
Vytvoří objekt a určuje, zda se použije k načítání nebo ukládání objektů.
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL);
Parametry
pFile
Ukazatel na CFile
objekt, který je konečným zdrojem nebo cílem trvalých dat.
nMode
Příznak, který určuje, zda budou objekty načteny z archivu nebo uloženy do archivu. Parametr nMode
musí mít jednu z následujících hodnot:
CArchive::load
Načte data z archivu. Vyžaduje pouzeCFile
oprávnění ke čtení.CArchive::store
Uloží data do archivu. VyžadujeCFile
oprávnění k zápisu.CArchive::bNoFlushOnDelete
Zabrání automatickému voláníFlush
archivu při volání destruktoru archivu. Pokud tento příznak nastavíte, zodpovídáte za explicitní voláníClose
před voláním destruktoru. Pokud ne, data budou poškozena.
nBufSize
Celé číslo, které určuje velikost interní vyrovnávací paměti souboru v bajtech. Všimněte si, že výchozí velikost vyrovnávací paměti je 4 096 bajtů. Pokud pravidelně archivujete velké objekty, zvýšíte výkon, pokud použijete větší velikost vyrovnávací paměti, která je násobkem velikosti vyrovnávací paměti souboru.
lpBuf
Volitelný ukazatel na uživatelsky zadanou vyrovnávací paměť velikosti nBufSize
. Pokud tento parametr nezadáte, archiv přidělí vyrovnávací paměť z místní haldy a uvolní ji při zničení objektu. Archiv neuvolní uživatelsky zadanou vyrovnávací paměť.
Poznámky
Po vytvoření archivu nelze tuto specifikaci změnit.
Operace se nemusejí používat CFile
ke změně stavu souboru, dokud archiv nezavřete. Jakákoli taková operace poškodí integritu archivu. Umístění ukazatele souboru můžete kdykoliv během serializace získat objekt souboru archivu z GetFile
členské funkce a pak použít CFile::GetPosition
funkci. Před získáním pozice ukazatele souboru byste měli zavolat CArchive::Flush
.
Příklad
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
Vyprázdní všechna data zbývající ve vyrovnávací paměti, zavře archiv a odpojí archiv ze souboru.
void Close();
Poznámky
Nejsou povoleny žádné další operace v archivu. Po zavření archivu můžete vytvořit další archiv pro stejný soubor nebo ho můžete zavřít.
Členová funkce Close
zajistí, že se všechna data přenesou z archivu do souboru a zpřístupní archiv. Chcete-li dokončit přenos ze souboru do úložného média, musíte nejprve použít CFile::Close
a poté zničit CFile
objekt.
Příklad
Podívejte se na příklad pro CArchive::WriteString.
CArchive::Flush
Vynutí zápis všech dat z archivní vyrovnávací paměti do souboru.
void Flush();
Poznámky
Členová funkce Flush
zajistí, že se všechna data přenesou z archivu do souboru. K dokončení přenosu ze souboru do úložného média musíte volat CFile::Close
.
Příklad
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
Získá ukazatel objektu CFile
pro tento archiv.
CFile* GetFile() const;
Návratová hodnota
Konstantní ukazatel na objekt, který CFile
se používá.
Poznámky
Před použitím GetFile
musíte archiv vyprázdnět .
Příklad
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Voláním této funkce z Serialize
funkce určíte verzi objektu, který je aktuálně deserializován.
UINT GetObjectSchema();
Návratová hodnota
Během deserializace verze objektu, který se čte.
Poznámky
Volání této funkce je platné pouze při načítání objektu CArchive
( CArchive::IsLoading
vrátí nenulové). Mělo by to být první volání funkce Serialize
a volá se pouze jednou. Návratová hodnota (UINT)-1 označuje, že číslo verze je neznámé.
CObject
-odvozená třída může použít VERSIONABLE_SCHEMA
kombinaci (pomocí bitové "or" (|
)) se samotnou verzí schématu (v IMPLEMENT_SERIAL
makre) k vytvoření "objektu s možností správy verzí", tj. objekt, jehož Serialize
členová funkce může číst více verzí. Výchozí funkce architektury (bez VERSIONABLE_SCHEMA
) je vyvolání výjimky v případech, kdy se verze neshoduje.
Příklad
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
Voláním této členské funkce určíte, zda je vnitřní vyrovnávací paměť archivu objektu prázdná.
BOOL IsBufferEmpty() const;
Návratová hodnota
Nenulové, pokud je vyrovnávací paměť archivu prázdná; jinak 0.
Poznámky
Tato funkce je poskytována pro podporu programování pomocí třídy MFC Windows Sockets CSocketFile
. Nemusíte ho používat pro archiv přidružený k objektu CFile
.
Důvodem použití IsBufferEmpty
s archivem přidruženým k objektu CSocketFile
je, že vyrovnávací paměť archivu může obsahovat více než jednu zprávu nebo záznam. Po přijetí jedné zprávy byste měli použít IsBufferEmpty
k řízení smyčky, která pokračuje v přijímání dat, dokud vyrovnávací paměť nebude prázdná. Další informace naleznete v Receive
členské funkci třídy CAsyncSocket
, která ukazuje, jak používat IsBufferEmpty
.
Další informace naleznete v tématu Windows Sockets: Použití soketů s archivy.
CArchive::IsLoading
Určuje, zda archiv načítá data.
BOOL IsLoading() const;
Návratová hodnota
Nenulové, pokud se archiv aktuálně používá k načítání; jinak 0.
Poznámky
Tato členová funkce je volána Serialize
funkcemi archivovaných tříd.
Příklad
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Určuje, zda archiv ukládá data.
BOOL IsStoring() const;
Návratová hodnota
Nenulové, pokud se archiv aktuálně používá k ukládání; jinak 0.
Poznámky
Tato členová funkce je volána Serialize
funkcemi archivovaných tříd.
IsStoring
Pokud je stav archivu nenulový, je jeho IsLoading
stav 0 a naopak.
Příklad
int i = 0;
if (ar.IsStoring())
ar << i;
else
ar >> i;
CArchive::MapObject
Voláním této členské funkce umístíte objekty do mapy, které nejsou ve skutečnosti serializovány do souboru, ale které jsou k dispozici pro podobjekty odkazované.
void MapObject(const CObject* pOb);
Parametry
pOb
Konstantní ukazatel na uložený objekt.
Poznámky
Můžete například serializovat dokument, ale serializovat položky, které jsou součástí dokumentu. MapObject
Zavoláním povolíte těmto položkám nebo podobjektům odkazovat na dokument. Serializované subitemy mohou také serializovat jejich m_pDocument
zadní ukazatel.
Při ukládání a načítání z objektu CArchive
můžete volatMapObject
. MapObject
přidá zadaný objekt do vnitřních datových struktur udržovaných objektem CArchive
během serializace a deserializace, ale na rozdíl od ReadObject
a WriteObject
, nevolá serializaci objektu.
Příklad
//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
Tento ukazatel na CDocument
hodnotu lze nastavit na cokoli, co chce uživatel CArchive
instance.
CDocument* m_pDocument;
Poznámky
Běžným použitím tohoto ukazatele je sdělit další informace o procesu serializace všem objektům, které jsou serializovány. Toho lze dosáhnout inicializací ukazatele s dokumentem (odvozenou CDocument
třídou), která je serializována, způsobem, jakým objekty v dokumentu mohou v případě potřeby přistupovat k dokumentu. Tento ukazatel je také používán COleClientItem
objekty během serializace.
Architektura se nastaví m_pDocument
na dokument serializovaný, když uživatel vydá příkaz Otevřít soubor nebo Uložit. Pokud serializujete dokument kontejneru ole (Object Linking and Embedding) z jiných důvodů než Soubor Otevřít nebo Uložit, musíte explicitně nastavit m_pDocument
. To byste například udělali při serializaci dokumentu kontejneru do schránky.
Příklad
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 <<
Uloží označený objekt nebo primitivní typ do archivu.
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);
Návratová hodnota
Odkaz CArchive
, který umožňuje více operátorů vložení na jeden řádek.
Poznámky
Poslední dvě výše uvedené verze jsou určené speciálně pro ukládání 64bitových celých čísel.
Pokud jste makro použili IMPLEMENT_SERIAL
v implementaci třídy, pak operátor vložení přetížený pro CObject
volání chráněné WriteObject
. Tato funkce zase volá Serialize
funkci třídy.
Operátor CStringT
vložení (<<
) podporuje výpis diagnostiky a ukládání do archivu.
Příklady
Tento příklad ukazuje použití operátoru CArchive
<<
vložení s typy int
a long
typy.
long l = 5;
int i = 10;
if (ar.IsStoring())
ar << l << i;
Tento příklad ukazuje použití operátoru CArchive
<<
vložení s typem CStringT
.
CString s("abc");
ar << s; // Prints the value (abc)
CArchive::operator >>
Načte označený objekt nebo primitivní typ z archivu.
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);
Návratová hodnota
Odkaz CArchive
, který umožňuje více operátorů extrakce na jednom řádku.
Poznámky
Poslední dvě výše uvedené verze jsou určené speciálně pro načítání 64bitových celých čísel.
Pokud jste makro použili IMPLEMENT_SERIAL
v implementaci třídy, operátory extrakce přetížené pro CObject
volání chráněné ReadObject
funkce (s nenulovým ukazatelem třídy za běhu). Tato funkce zase volá Serialize
funkci třídy.
Operátor CStringT
extrakce (>>
) podporuje načítání z archivu.
Příklady
Tento příklad ukazuje použití operátoru CArchive
>>
extrakce s typem int
.
long l;
int i;
if (ar.IsLoading())
ar >> l >> i;
Tento příklad ukazuje použití CArchive
operátorů <<
vložení a extrakce a >>
s typem CStringT
.
CString s;
if (ar.IsLoading())
ar >> s;
CArchive::Read
Načte zadaný počet bajtů z archivu.
UINT Read(void* lpBuf, UINT nMax);
Parametry
lpBuf
Ukazatel na uživatelsky zadanou vyrovnávací paměť, která přijímá data načtená z archivu.
nMax
Celé číslo bez znaménka určující počet bajtů, které se mají číst z archivu.
Návratová hodnota
Celé číslo bez znaménka obsahující počet bajtů, které se skutečně čtou. Pokud je vrácená hodnota menší než požadované číslo, bylo dosaženo konce souboru. V podmínce end-of-file se nevyvolá žádná výjimka.
Poznámky
Archiv neinterpretuje bajty.
Členovou funkci v rámci funkce Serialize
můžete použít Read
ke čtení běžných struktur obsažených v objektech.
Příklad
char pbRead[100];
ar.Read(pbRead, 100);
CArchive::ReadClass
Voláním této členské funkce přečtete odkaz na třídu, která byla dříve uložena s WriteClass
.
CRuntimeClass* ReadClass(
const CRuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* pObTag = NULL);
Parametry
pClassRefRequested
Ukazatel na CRuntimeClass
strukturu, která odpovídá požadovanému odkazu na třídu. Může to být NULL
.
pSchema
Ukazatel na schéma třídy runtime, která byla dříve uložena.
pObTag
Číslo, které odkazuje na jedinečnou značku objektu. Interně používáno prováděním .ReadObject
Vystaveno pouze pro pokročilé programování; pObTag
normálně by měla být NULL
.
Návratová hodnota
Ukazatel na CRuntimeClass
strukturu.
Poznámky
Pokud pClassRefRequested
není NULL
, ReadClass
ověří, že archivované informace o třídě jsou kompatibilní s vaší třídou runtime. Pokud není kompatibilní, ReadClass
vyvolá chybu CArchiveException
.
Vaše třída modulu runtime musí používat DECLARE_SERIAL
a IMPLEMENT_SERIAL
v opačném případě ReadClass
vyvolá výjimku CNotSupportedException
.
Pokud pSchema
ano NULL
, schéma uložené třídy lze načíst voláním CArchive::GetObjectSchema
; jinak *pSchema
bude obsahovat schéma třídy runtime, která byla dříve uložena.
Místo toho můžete použít SerializeClass
ReadClass
, který zpracovává čtení i zápis odkazu na třídu.
Příklad
Podívejte se na příklad pro CArchive::WriteClass
.
CArchive::ReadObject
Načte data objektu z archivu a vytvoří objekt odpovídajícího typu.
CObject* ReadObject(const CRuntimeClass* pClass);
Parametry
pClass
Konstantní ukazatel na CRuntimeClass
strukturu, která odpovídá objektu, který očekáváte číst.
Návratová hodnota
CObject
Ukazatel, který musí být bezpečně přetypován na správnou odvozenou třídu pomocí CObject::IsKindOf
.
Poznámky
Tuto funkci obvykle volá CArchive
operátor extrakce ( >>
) přetížený pro CObject
ukazatel. ReadObject
, dále volá Serialize
funkci archivované třídy.
Pokud zadáte nenulový pClass
parametr, který získá RUNTIME_CLASS
makro, funkce ověří třídu runtime archivovaného objektu. Předpokládá se, že jste makro použili IMPLEMENT_SERIAL
při implementaci třídy.
Příklad
Podívejte se na příklad pro CArchive::WriteObject
.
CArchive::ReadString
Voláním této členské funkce načtěte textová data do vyrovnávací paměti ze souboru přidruženého k objektu CArchive
.
BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
Parametry
rString
Odkaz na CString
takový, který bude obsahovat výsledný řetězec po načtení ze souboru přidruženého k objektu CArchive
.
lpsz
Určuje ukazatel na uživatelsky zadanou vyrovnávací paměť, která obdrží textový řetězec s ukončenou hodnotou null.
nMax
Určuje maximální počet znaků, které se mají přečíst. Měla by být jedna menší než velikost lpsz
vyrovnávací paměti.
Návratová hodnota
Ve verzi, která vrátí logickou hodnotu BOOL, TRUE
pokud je úspěšná, FALSE
jinak.
Ve verzi, která vrací LPTSTR
ukazatel na vyrovnávací paměť obsahující textová data; NULL
pokud bylo dosaženo konce souboru.
Poznámky
Ve verzi členské funkce s parametrem nMax
bude vyrovnávací paměť obsahovat limit až nMax
1 znaků. Čtení je zastaveno dvojicí návratového kanálu řádku na řádku. Koncové znaky nového řádku jsou vždy odebrány. Znak NULL
(\0) se připojí v obou případech.
CArchive::Read
je také k dispozici pro vstup v textovém režimu, ale neukončí se u dvojice návratového kanálu řádku řádku.
Příklad
Podívejte se na příklad pro CArchive::WriteString
.
CArchive::SerializeClass
Tuto členskou funkci zavolejte, pokud chcete uložit a načíst informace o verzi základní třídy.
void SerializeClass(const CRuntimeClass* pClassRef);
Parametry
pClassRef
Ukazatel na objekt třídy run-time pro základní třídu.
Poznámky
SerializeClass
přečte nebo zapíše odkaz na třídu do objektu CArchive
v závislosti na směru objektu CArchive
. Místo SerializeClass
a WriteClass
jako pohodlný způsob serializace objektů základní třídy; SerializeClass
vyžaduje méně kódu ReadClass
a méně parametrů.
Podobně jako ReadClass
, SerializeClass
ověřuje, že archivované informace třídy jsou kompatibilní s vaší třídou runtime. Pokud není kompatibilní, SerializeClass
vyvolá chybu CArchiveException
.
Vaše třída modulu runtime musí používat DECLARE_SERIAL
a IMPLEMENT_SERIAL
v opačném případě SerializeClass
vyvolá výjimku CNotSupportedException
.
RUNTIME_CLASS
Pomocí makra načtěte hodnotu parametrupRuntimeClass
. Základní třída musí makro použít IMPLEMENT_SERIAL
.
Příklad
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
Volání SetLoadParams
, když budete číst velký počet -odvozených CObject
objektů z archivu.
void SetLoadParams(UINT nGrowBy = 1024);
Parametry
nGrowBy
Minimální počet slotů prvků, které se mají přidělit, pokud je potřeba zvětšit velikost.
Poznámky
CArchive
používá k překladu odkazů na objekty uložené v archivu pole zatížení. SetLoadParams
umožňuje nastavit velikost, na kterou se pole zatížení zvětšuje.
Po načtení nebo volání MapObject
ReadObject
žádného objektu nesmíte volatSetLoadParams
.
Příklad
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
Voláním této členské funkce nastavíte schéma objektu uloženého v archivačním objektu na nSchema
hodnotu .
void SetObjectSchema(UINT nSchema);
Parametry
nSchema
Určuje schéma objektu.
Poznámky
Další volání GetObjectSchema
vrátí hodnotu uloženou v nSchema
.
Slouží SetObjectSchema
k rozšířené správě verzí, například pokud chcete vynutit čtení určité verze ve Serialize
funkci odvozené třídy.
Příklad
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Používá se SetStoreParams
při ukládání velkého počtu odvozených CObject
objektů do archivu.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Parametry
nHashSize
Velikost hashovací tabulky pro mapy ukazatelů rozhraní. Mělo by to být základní číslo.
nBlockSize
Určuje členitost přidělení paměti pro rozšíření parametrů. Pro zajištění nejlepšího výkonu by měl být výkon 2.
Poznámky
SetStoreParams
umožňuje nastavit velikost tabulky hash a velikost bloku mapy sloužící k identifikaci jedinečných objektů během procesu serializace.
Po uložení nebo volání MapObject
WriteObject
objektů nesmíte volatSetStoreParams
.
Příklad
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
Zapíše zadaný počet bajtů do archivu.
void Write(const void* lpBuf, INT nMax);
Parametry
lpBuf
Ukazatel na vyrovnávací paměť zadanou uživatelem, která obsahuje data, která se mají zapisovat do archivu.
nMax
Celé číslo, které určuje počet bajtů, které mají být zapsány do archivu.
Poznámky
Archiv nenaformátuje bajty.
Členovou funkci v rámci funkce Serialize
můžete použít k zápisu Write
běžných struktur, které jsou obsaženy v objektech.
Příklad
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Slouží WriteClass
k uložení informací o verzi a třídě základní třídy během serializace odvozené třídy.
void WriteClass(const CRuntimeClass* pClassRef);
Parametry
pClassRef
Ukazatel na CRuntimeClass
strukturu, která odpovídá požadovanému odkazu na třídu.
Poznámky
WriteClass
zapíše odkaz na CRuntimeClass
základní třídu do objektu CArchive
. Slouží CArchive::ReadClass
k načtení odkazu.
WriteClass
ověřuje, že archivované informace o třídě jsou kompatibilní s vaší třídou runtime. Pokud není kompatibilní, WriteClass
vyvolá chybu CArchiveException
.
Vaše třída modulu runtime musí používat DECLARE_SERIAL
a IMPLEMENT_SERIAL
v opačném případě WriteClass
vyvolá výjimku CNotSupportedException
.
Místo toho můžete použít SerializeClass
WriteClass
, který zpracovává čtení i zápis odkazu na třídu.
Příklad
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
Uloží zadaný CObject
do archivu.
void WriteObject(const CObject* pOb);
Parametry
pOb
Konstantní ukazatel na uložený objekt.
Poznámky
Tato funkce je obvykle volána operátorem CArchive
vložení ( <<
) přetížené pro CObject
. WriteObject
, dále volá Serialize
funkci archivované třídy.
K povolení archivace je nutné použít IMPLEMENT_SERIAL
makro. WriteObject
zapíše název třídy ASCII do archivu. Tento název třídy se později ověří během procesu načítání. Speciální schéma kódování zabraňuje zbytečné duplikaci názvu třídy pro více objektů třídy. Toto schéma také zabraňuje redundantnímu ukládání objektů, které jsou cílem více než jednoho ukazatele.
Přesná metoda kódování objektů (včetně přítomnosti názvu třídy ASCII) je podrobnosti implementace a mohla by se změnit v budoucích verzích knihovny.
Poznámka:
Než začnete archivovat, dokončete vytváření, odstraňování a aktualizaci všech objektů. Archiv se poškodí, pokud archivujete s úpravou objektu.
Příklad
Definice třídy CAge
naleznete v CObList::CObList
příkladu .
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
Tato členová funkce slouží k zápisu dat z vyrovnávací paměti do souboru přidruženého k objektu CArchive
.
void WriteString(LPCTSTR lpsz);
Parametry
lpsz
Určuje ukazatel na vyrovnávací paměť obsahující textový řetězec ukončený hodnotou null.
Poznámky
Ukončující znak null (\0) není zapsán do souboru; ani není nový řádek automaticky zapsán.
WriteString
vyvolá výjimku v reakci na několik podmínek, včetně podmínky plného disku.
Write
je také k dispozici, ale místo ukončení znaku null zapíše požadovaný počet bajtů do souboru.
Příklad
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);
Viz také
Graf hierarchie
CFile
Třída
CObject
Třída
CSocket
Třída
CSocketFile
Třída