CArchive
Sınıf
Karmaşık bir nesne ağını, bu nesneler silindikten sonra kalıcı bir ikili biçimde (genellikle disk depolama) kaydetmenizi sağlar.
Sözdizimi
class CArchive
Üyeler
Ortak Oluşturucular
Veri Akışı Adı | Açıklama |
---|---|
CArchive::CArchive |
Bir CArchive nesnesi oluşturur. |
Genel Yöntemler
Veri Akışı Adı | Açıklama |
---|---|
CArchive::Abort |
Özel durum oluşturmadan bir arşivi kapatır. |
CArchive::Close |
Yazılmamış verileri temizler ve bağlantısını CFile keser. |
CArchive::Flush |
Arşiv arabelleğinden yazılmamış verileri temizler. |
CArchive::GetFile |
CFile Bu arşiv için nesne işaretçisini alır. |
CArchive::GetObjectSchema |
Seri durumdan çıkarılmakta Serialize olan nesnenin sürümünü belirlemek için işlevinden çağrılır. |
CArchive::IsBufferEmpty |
Windows Yuvaları alma işlemi sırasında arabelleğin boşaltılıp boşaltılmadığını belirler. |
CArchive::IsLoading |
Arşivin yüklenip yüklenmediğini belirler. |
CArchive::IsStoring |
Arşivin depolanıp depolamayacağını belirler. |
CArchive::MapObject |
Eşlemeye dosyaya serileştirilmemiş, ancak başvuruda bulunabilecek alt nesneler için kullanılabilen nesneleri yerleştirir. |
CArchive::Read |
Ham baytları okur. |
CArchive::ReadClass |
Daha önce ile WriteClass depolanan bir sınıf başvurusını okur. |
CArchive::ReadObject |
Bir nesnenin Serialize yükleme işlevini çağırır. |
CArchive::ReadString |
Tek bir metin satırını okur. |
CArchive::SerializeClass |
öğesinin yönüne CArchive bağlı olarak nesneye CArchive sınıf başvuruyu okur veya yazar. |
CArchive::SetLoadParams |
Yük dizisinin büyüdüğü boyutu ayarlar. Herhangi bir nesne yüklenmeden önce veya çağrılmadan önce MapObject ReadObject çağrılmalıdır. |
CArchive::SetObjectSchema |
Arşiv nesnesinde depolanan nesne şemasını ayarlar. |
CArchive::SetStoreParams |
Karma tablo boyutunu ve serileştirme işlemi sırasında benzersiz nesneleri tanımlamak için kullanılan eşlemenin blok boyutunu ayarlar. |
CArchive::Write |
Ham bayt yazar. |
CArchive::WriteClass |
öğesine CRuntimeClass CArchive bir başvuru yazar. |
CArchive::WriteObject |
Bir nesnenin Serialize depolama işlevini çağırır. |
CArchive::WriteString |
Tek bir metin satırı yazar. |
Ortak İşleçler
Veri Akışı Adı | Açıklama |
---|---|
CArchive::operator << |
Nesneleri ve ilkel türleri arşive depolar. |
CArchive::operator >> |
Nesneleri ve ilkel türleri arşivden yükler. |
Ortak Veri Üyeleri
Veri Akışı Adı | Açıklama |
---|---|
CArchive::m_pDocument |
Açıklamalar
CArchive
temel sınıfına sahip değildir.
Daha sonra nesneleri kalıcı depolamadan yükleyerek bunları bellekte yeniden oluşturabilirsiniz. Verileri kalıcı hale getirme işlemine "serileştirme" adı verilir.
Arşiv nesnesini bir tür ikili akış olarak düşünebilirsiniz. Giriş/çıkış akışı gibi arşiv de bir dosyayla ilişkilendirilir ve depolama alanına ve depolamadan gelen verilerin arabelleğe alınıp okunmasına izin verir. Giriş/çıkış akışı ASCII karakter dizilerini işler, ancak arşiv ikili nesne verilerini verimli, yedekli olmayan bir biçimde işler.
Nesne oluşturabilmeniz CFile
için önce bir CArchive
nesne oluşturmanız gerekir. Ayrıca, arşivin yükleme/depolama durumunun dosyanın açık moduyla uyumlu olduğundan emin olmanız gerekir. Dosya başına bir etkin arşivle sınırlısınız.
Bir CArchive
nesne oluşturduğunuzda, açık bir dosyayı temsil eden bir sınıf CFile
nesnesine (veya türetilmiş bir sınıfa) eklersiniz. Ayrıca, arşivin yükleme veya depolama için kullanılıp kullanılmayacağını da belirtirsiniz. Bir CArchive
nesne yalnızca ilkel türleri değil, serileştirme için tasarlanmış türetilmiş sınıfların CObject
nesnelerini de işleyebilir. Serileştirilebilir bir sınıfın genellikle bir Serialize
üye işlevi vardır ve genellikle sınıfı CObject
altında açıklandığı gibi ve IMPLEMENT_SERIAL
makrolarını kullanırDECLARE_SERIAL
.
Aşırı yüklenmiş ayıklama ( >>
) ve ekleme ( <<
) işleçleri hem temel türleri CObject
hem de türetilmiş sınıfları destekleyen kullanışlı arşiv programlama arabirimleridir.
CArchive
ayrıca MFC Windows Yuva sınıfları CSocket
ve CSocketFile
ile programlamayı da destekler. IsBufferEmpty
Üye işlevi bu kullanımı destekler.
hakkında CArchive
daha fazla bilgi için Serileştirme ve Windows Yuvaları: Yuvaları Arşivlerle Kullanma makalelerine bakın.
Devralma Hiyerarşisi
CArchive
Gereksinimler
Üstbilgi: afx.h
CArchive::Abort
Özel durum oluşturmadan arşivi kapatmak için bu işlevi çağırın.
void Abort ();
Açıklamalar
Yıkıcı CArchive
normalde çağrısında Close
bulunur ve ilişkili CFile
nesneye kaydedilmemiş tüm verileri temizler. Bu durum özel durumlara neden olabilir.
Bu özel durumları yakalarken, nesnesinin yok olması CArchive
başka özel durumlara neden olmaması için kullanmak Abort
iyi bir fikirdir. Özel durumları işlerken, CArchive::Abort
hatalarda bir özel durum oluşturmaz çünkü , aksine CArchive::Close
Abort
hataları yoksayar.
Nesneyi yığında ayırmak CArchive
için kullandıysanıznew
, dosyayı kapattıktan sonra silmeniz gerekir.
Örnek
örneğine CArchive::WriteClass
bakın.
CArchive::CArchive
Bir CArchive
nesne oluşturur ve nesneleri yüklemek veya depolamak için kullanılıp kullanılmayacağını belirtir.
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL);
Parametreler
pFile
CFile
Kalıcı verilerin nihai kaynağı veya hedefi olan nesne işaretçisi.
nMode
Nesnelerin arşivden yüklenip yüklenmeyeceğini veya arşive depolanıp depolanmayacağını belirten bir bayrak. nMode
parametresi aşağıdaki değerlerden birine sahip olmalıdır:
CArchive::load
Arşivden verileri yükler. YalnızcaCFile
okuma izni gerektirir.CArchive::store
Verileri arşive kaydeder.CFile
Yazma izni gerektirir.CArchive::bNoFlushOnDelete
Arşiv yıkıcı çağrıldığında arşivin otomatik olarak çağrılmasınıFlush
engeller. Bu bayrağı ayarlarsanız, yıkıcı çağrılmadan önce açıkça çağırmaktanClose
sorumlu olursunuz. Aksi takdirde verileriniz bozulur.
nBufSize
İç dosya arabelleğinin boyutunu bayt cinsinden belirten bir tamsayı. Varsayılan arabellek boyutunun 4.096 bayt olduğunu unutmayın. Büyük nesneleri düzenli olarak arşivlerseniz, dosya arabelleği boyutunun katı olan daha büyük bir arabellek boyutu kullanırsanız performansı geliştirirsiniz.
lpBuf
Kullanıcı tarafından sağlanan boyut nBufSize
arabelleğine yönelik isteğe bağlı işaretçi. Bu parametreyi belirtmezseniz, arşiv yerel yığından bir arabellek ayırır ve nesne yok edildiğinde bu arabellekten kurtarır. Arşiv, kullanıcı tarafından sağlanan bir arabelleği boşaltmaz.
Açıklamalar
Arşivi oluşturduktan sonra bu belirtimi değiştiremezsiniz.
Arşivi kapatana kadar dosyanın durumunu değiştirmek için işlemleri kullanamazsınız CFile
. Bu tür işlemler arşivin bütünlüğüne zarar verir. Arşivdeki dosya nesnesini üye işlevinden alıp işlevini kullanarak serileştirme sırasında istediğiniz zaman dosya işaretçisinin GetFile
konumuna CFile::GetPosition
erişebilirsiniz. Dosya işaretçisinin konumunu almadan önce çağırmalısınız CArchive::Flush
.
Örnek
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
Arabellekte kalan tüm verileri temizler, arşivi kapatır ve arşivin dosyayla bağlantısını keser.
void Close();
Açıklamalar
Arşiv üzerinde başka işlemlere izin verilmez. Bir arşivi kapattıktan sonra, aynı dosya için başka bir arşiv oluşturabilir veya dosyayı kapatabilirsiniz.
Üye işlevi Close
, tüm verilerin arşivden dosyaya aktarılmasını sağlar ve arşivi kullanılamaz hale getirir. Dosyadan depolama ortamına aktarımı tamamlamak için önce nesnesini kullanmanız CFile::Close
ve ardından yok CFile
etmeniz gerekir.
Örnek
CArchive::WriteString örneğine bakın.
CArchive::Flush
Arşiv arabelleğinde kalan tüm verileri dosyaya yazılacak şekilde zorlar.
void Flush();
Açıklamalar
Üye işlevi Flush
, tüm verilerin arşivden dosyaya aktarılmasını sağlar. Dosyadan depolama ortamına aktarımı tamamlamak için aramanız CFile::Close
gerekir.
Örnek
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
CFile
Bu arşiv için nesne işaretçisini alır.
CFile* GetFile() const;
Dönüş Değeri
Kullanılan nesnenin CFile
sabit işaretçisi.
Açıklamalar
kullanmadan GetFile
önce arşivi temizlemeniz gerekir.
Örnek
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Şu anda seri durumdan çıkarılmakta olan nesnenin sürümünü belirlemek için işlevinden Serialize
bu işlevi çağırın.
UINT GetObjectSchema();
Dönüş Değeri
Seri durumdan çıkarma sırasında okunan nesnenin sürümü.
Açıklamalar
Bu işlevi çağırmak yalnızca nesne yüklenirken CArchive
geçerlidir ( CArchive::IsLoading
sıfır olmayan döndürür). İşlevdeki Serialize
ilk çağrı olmalı ve yalnızca bir kez çağrılmalıdır. ( UINT)-1 dönüş değeri, sürüm numarasının bilinmediğini gösterir.
CObject
Türetilmiş bir sınıfVERSIONABLE_SCHEMA
, birleştirilmiş (bit düzeyinde "veya" (|
)kullanarak) şema sürümünün kendisiyle (makrodaIMPLEMENT_SERIAL
) birlikte kullanarak bir "sürümlenebilir nesne" (yani üye işlevi birden çok sürümü okuyabilen bir nesneSerialize
) oluşturabilir. Varsayılan çerçeve işlevi (olmadan VERSIONABLE_SCHEMA
), sürüm eşleşmediğinde bir özel durum oluşturur.
Örnek
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
Arşiv nesnesinin iç arabelleğinin boş olup olmadığını belirlemek için bu üye işlevini çağırın.
BOOL IsBufferEmpty() const;
Dönüş Değeri
Arşivin arabelleği boşsa sıfır olmayan; aksi takdirde 0.
Açıklamalar
Bu işlev, MFC Windows Yuvaları sınıfı CSocketFile
ile programlamayı desteklemek için sağlanır. Nesneyle CFile
ilişkilendirilmiş bir arşiv için kullanmanız gerekmez.
Bir nesneyle ilişkilendirilmiş bir arşivle CSocketFile
kullanmanın IsBufferEmpty
nedeni, arşivin arabelleğinin birden fazla ileti veya kayıt içerebileceğidir. Bir ileti aldıktan sonra, arabellek boş olana kadar veri almaya devam eden bir döngünün denetimini kullanmanız IsBufferEmpty
gerekir. Daha fazla bilgi için, öğesinin Receive
nasıl kullanılacağını IsBufferEmpty
gösteren sınıfının CAsyncSocket
üye işlevine bakın.
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
CArchive::IsLoading
Arşivin verileri yükleyip yüklemediğini belirler.
BOOL IsLoading() const;
Dönüş Değeri
Arşiv şu anda yükleme için kullanılıyorsa sıfır olmayan; aksi takdirde 0.
Açıklamalar
Bu üye işlevi, arşivlenen sınıfların Serialize
işlevleri tarafından çağrılır.
Örnek
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Arşivin verileri depolayıp depolamadığını belirler.
BOOL IsStoring() const;
Dönüş Değeri
Arşiv şu anda depolamak için kullanılıyorsa sıfır olmayan; aksi takdirde 0.
Açıklamalar
Bu üye işlevi, arşivlenen sınıfların Serialize
işlevleri tarafından çağrılır.
Bir arşivin IsStoring
durumu sıfır değilse, IsLoading
durumu 0'dır ve tam tersi de geçerlidir.
Örnek
int i = 0;
if (ar.IsStoring())
ar << i;
else
ar >> i;
CArchive::MapObject
Aslında dosyaya seri hale getirilmemiş, ancak başvuruda bulunabilecek alt nesnelerde kullanılabilen nesneleri eşlemeye yerleştirmek için bu üye işlevini çağırın.
void MapObject(const CObject* pOb);
Parametreler
pOb
Depolanmakta olan nesnenin sabit işaretçisi.
Açıklamalar
Örneğin, bir belgeyi seri hale getirmeyebilirsiniz, ancak belgenin parçası olan öğeleri seri hale getirebilirsiniz. çağrısı MapObject
yaparak, bu öğelerin veya alt nesnelerin belgeye başvurmasına izin verirsiniz. Ayrıca, seri hale getirilmiş altitems arka işaretçilerini m_pDocument
seri hale getirebilirsiniz.
öğesini depoladığınızda ve nesnesinden CArchive
yüklediğinizde çağırabilirsinizMapObject
. MapObject
belirtilen nesneyi serileştirme ve seri durumdan çıkarma sırasında nesne tarafından CArchive
tutulan iç veri yapılarına ekler, ancak ve WriteObject
'den farklı ReadObject
olarak nesnede serileştirmeyi çağırmaz.
Örnek
//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
varsayılan olarak olarak ayarlanır, örneğin bu işaretçisi, örneğin kullanıcısının istediği herhangi bir CDocument
değere CArchive
ayarlanabilir.
CDocument* m_pDocument;
Açıklamalar
Bu işaretçinin yaygın kullanımlarından biri, seri hale getirilen tüm nesnelere serileştirme işlemi hakkında ek bilgiler iletmektir. Bu, işaretçiyi seri hale getirilen belgeyle (türetilmiş bir CDocument
sınıf) belge içindeki nesnelerin gerekirse belgeye erişebileceği şekilde başlatarak elde edilir. Bu işaretçi, serileştirme sırasında nesneler tarafından COleClientItem
da kullanılır.
Çerçeve, bir kullanıcı Dosya Aç veya Kaydet komutu verdikten sonra seri hale getirilmekte olan belgeye ayarlar m_pDocument
. Dosya Açma veya Kaydetme dışındaki nedenlerle Nesne Bağlama ve Ekleme (OLE) kapsayıcı belgesini seri hale getirdiyseniz, öğesini açıkça ayarlamanız m_pDocument
gerekir. Örneğin, bir kapsayıcı belgesini Pano'ya seri hale getirdiğinizde bunu yapabilirsiniz.
Örnek
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 <<
Belirtilen nesneyi veya ilkel türü arşive depolar.
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);
Dönüş Değeri
Tek CArchive
bir satırda birden çok ekleme işlecini etkinleştiren başvuru.
Açıklamalar
Yukarıdaki son iki sürüm özellikle 64 bit tamsayıları depolamak içindir.
Makroyu IMPLEMENT_SERIAL
sınıf uygulamanızda kullandıysanız, ekleme işleci için CObject
aşırı yüklenmiş olarak korunan WriteObject
öğesini çağırır. Bu işlev de sınıfının işlevini çağırır Serialize
.
Ekleme CStringT
işleci (<<
), tanılama dökümünü ve arşive depolanmayı destekler.
Örnekler
Bu örnek, ve long
türleriyle ekleme işlecinin <<
CArchive
int
kullanımını gösterir.
long l = 5;
int i = 10;
if (ar.IsStoring())
ar << l << i;
Bu örnek, ekleme işlecinin CArchive
<<
türüyle CStringT
kullanımını gösterir.
CString s("abc");
ar << s; // Prints the value (abc)
CArchive::operator >>
Belirtilen nesneyi veya ilkel türü arşivden yükler.
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);
Dönüş Değeri
Tek CArchive
bir satırda birden çok ayıklama işlecini etkinleştiren bir başvuru.
Açıklamalar
Yukarıdaki son iki sürüm özellikle 64 bit tamsayıları yüklemeye yöneliktir.
Makroyu IMPLEMENT_SERIAL
sınıf uygulamanızda kullandıysanız, ayıklama işleçleri korumalı ReadObject
işlevi çağırmak için CObject
aşırı yüklenmiştir (sıfır olmayan bir çalışma zamanı sınıf işaretçisiyle). Bu işlev de sınıfının işlevini çağırır Serialize
.
CStringT
Ayıklama işleci (>>
) bir arşivden yüklemeyi destekler.
Örnekler
Bu örnek, ayıklama işlecinin CArchive
>>
türüyle int
kullanımını gösterir.
long l;
int i;
if (ar.IsLoading())
ar >> l >> i;
Bu örnekte ekleme ve ayıklama işleçlerinin CArchive
<<
kullanımı ve >>
türü gösterilmektedir CStringT
.
CString s;
if (ar.IsLoading())
ar >> s;
CArchive::Read
Arşivden belirtilen sayıda bayt okur.
UINT Read(void* lpBuf, UINT nMax);
Parametreler
lpBuf
Arşivden okunan verileri almak için kullanıcı tarafından sağlanan arabelleğe işaretçi.
nMax
Arşivden okunacak bayt sayısını belirten imzasız tamsayı.
Dönüş Değeri
Aslında okunan bayt sayısını içeren işaretsiz bir tamsayı. Dönüş değeri istenen sayıdan küçükse dosyanın sonuna ulaşılmıştır. Dosya sonu koşulunda özel durum oluşturulur.
Açıklamalar
Arşiv baytları yorumlamaz.
Nesnelerinizde bulunan sıradan yapıları okumak için işlevinizin Serialize
içindeki üye işlevini kullanabilirsinizRead
.
Örnek
char pbRead[100];
ar.Read(pbRead, 100);
CArchive::ReadClass
Daha önce ile WriteClass
depolanan bir sınıfa başvuru okumak için bu üye işlevini çağır.
CRuntimeClass* ReadClass(
const CRuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* pObTag = NULL);
Parametreler
pClassRefRequested
İstenen sınıf başvurusuna karşılık gelen yapıya yönelik bir işaretçi CRuntimeClass
. olabilir NULL
.
pSchema
Daha önce depolanan çalışma zamanı sınıfının şemasına ilişkin bir işaretçi.
pObTag
Bir nesnenin benzersiz etiketine başvuran bir sayı. uygulaması ReadObject
tarafından dahili olarak kullanılır. Yalnızca gelişmiş programlama için kullanıma sunuldu; pObTag
normalde olmalıdır NULL
.
Dönüş Değeri
Yapı işaretçisi CRuntimeClass
.
Açıklamalar
NULL
değilsepClassRefRequested
, ReadClass
arşivlenen sınıf bilgilerinin çalışma zamanı sınıfınızla uyumlu olduğunu doğrular. Uyumlu değilse, ReadClass
bir CArchiveException
oluşturur.
Çalışma zamanı sınıfınız ve kullanmalıdırDECLARE_SERIAL
; aksi takdirde ReadClass
bir CNotSupportedException
oluşturur.IMPLEMENT_SERIAL
ise pSchema
NULL
, depolanan sınıfın şeması çağrılarak CArchive::GetObjectSchema
alınabilir; aksi takdirde, *pSchema
daha önce depolanmış olan çalışma zamanı sınıfının şemasını içerir.
sınıf başvurusunun ReadClass
hem okunmasını hem de yazmasını işleyen yerine kullanabilirsinizSerializeClass
.
Örnek
örneğine CArchive::WriteClass
bakın.
CArchive::ReadObject
Arşivden nesne verilerini okur ve uygun türde bir nesne oluşturur.
CObject* ReadObject(const CRuntimeClass* pClass);
Parametreler
pClass
Okumayı beklediğiniz nesneye CRuntimeClass
karşılık gelen yapıya yönelik sabit bir işaretçi.
Dönüş Değeri
CObject
kullanılarak CObject::IsKindOf
doğru türetilmiş sınıfa güvenli bir şekilde atanması gereken bir işaretçi.
Açıklamalar
Bu işlev normalde bir CObject
işaretçi için aşırı yüklenmiş ayıklama ( >>
) işleci tarafından CArchive
çağrılır. ReadObject
, arşivlenmiş sınıfın Serialize
işlevini çağırır.
Makro tarafından RUNTIME_CLASS
elde edilen sıfır pClass
olmayan bir parametre sağlarsanız, işlev arşivlenen nesnenin çalışma zamanı sınıfını doğrular. Bu, sınıfın uygulamasında makroyu IMPLEMENT_SERIAL
kullandığınızı varsayar.
Örnek
örneğine CArchive::WriteObject
bakın.
CArchive::ReadString
Nesneyle ilişkilendirilmiş dosyadan bir arabelleğe metin verilerini okumak için bu üye işlevini çağırın CArchive
.
BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
Parametreler
rString
Nesnesiyle CArchive
ilişkilendirilmiş dosyadan okunduktan sonra elde edilen dizeyi içerecek bir CString
başvuru.
lpsz
Null olarak sonlandırılan bir metin dizesi alacak kullanıcı tarafından sağlanan arabelleğe yönelik bir işaretçi belirtir.
nMax
Okunacak karakter sayısı üst sınırını belirtir. Arabellek boyutundan lpsz
bir küçük olmalıdır.
Dönüş Değeri
BOOL döndüren sürümde, TRUE
başarılı olursa; FALSE
aksi takdirde.
bir döndüren LPTSTR
sürümde, dosya sonuna ulaşıldıysa, metin verilerini NULL
içeren arabelleğe yönelik bir işaretçi.
Açıklamalar
parametresine sahip nMax
üye işlevinin sürümünde arabellek en fazla 1 karakterlik bir sınır nMax
tutar. Okuma, satır başı besleme çifti tarafından durdurulur. Sondaki yeni satır karakterleri her zaman kaldırılır. Her NULL
iki durumda da bir karakter ('\0') eklenir.
CArchive::Read
metin modu girişi için de kullanılabilir, ancak satır başı besleme çiftinde sonlandırılmaz.
Örnek
örneğine CArchive::WriteString
bakın.
CArchive::SerializeClass
Temel sınıfın sürüm bilgilerini depolamak ve yüklemek istediğinizde bu üye işlevini çağırın.
void SerializeClass(const CRuntimeClass* pClassRef);
Parametreler
pClassRef
Temel sınıf için bir çalışma zamanı sınıf nesnesine yönelik bir işaretçi.
Açıklamalar
SerializeClass
nesnesinin yönüne CArchive
bağlı olarak bir sınıfa başvuruyu CArchive
okur veya yazar. Temel sınıf nesneleri seri hale getirmek için uygun bir yol olarak ve WriteClass
yerine ReadClass
kullanınSerializeClass
; SerializeClass
daha az kod ve daha az parametre gerektirir.
gibi ReadClass
, SerializeClass
arşivlenen sınıf bilgilerinin çalışma zamanı sınıfınızla uyumlu olduğunu doğrular. Uyumlu değilse, SerializeClass
bir CArchiveException
oluşturur.
Çalışma zamanı sınıfınız ve kullanmalıdırDECLARE_SERIAL
; aksi takdirde SerializeClass
bir CNotSupportedException
oluşturur.IMPLEMENT_SERIAL
parametresinin RUNTIME_CLASS
değerini almak için makroyu pRuntimeClass
kullanın. Temel sınıf makroyu IMPLEMENT_SERIAL
kullanmalıdır.
Örnek
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
Arşivden çok sayıda CObject
türetilmiş nesne okuyacağınız zaman çağırınSetLoadParams
.
void SetLoadParams(UINT nGrowBy = 1024);
Parametreler
nGrowBy
Boyut artışı gerekiyorsa ayrılacak en az öğe yuvası sayısı.
Açıklamalar
CArchive
arşivde depolanan nesnelere yapılan başvuruları çözümlemek için bir yük dizisi kullanır. SetLoadParams
, yük dizisinin büyüdüğü boyutu ayarlamanıza olanak tanır.
Herhangi bir nesne yüklendikten sonra veya çağrıldıktan sonra MapObject
ReadObject
çağırmamalısınızSetLoadParams
.
Örnek
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
Arşiv nesnesinde depolanan nesne şemasını olarak ayarlamak için nSchema
bu üye işlevini çağırın.
void SetObjectSchema(UINT nSchema);
Parametreler
nSchema
Nesnenin şemasını belirtir.
Açıklamalar
Sonraki çağrısı GetObjectSchema
içinde nSchema
depolanan değeri döndürür.
Gelişmiş sürüm oluşturma için kullanın SetObjectSchema
; örneğin, belirli bir sürümü türetilmiş bir sınıfın işlevinde Serialize
okunmaya zorlamak istediğinizde.
Örnek
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Arşivde çok sayıda CObject
türetilmiş nesne depolarken kullanınSetStoreParams
.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Parametreler
nHashSize
Arabirim işaretçisi eşlemeleri için karma tablosunun boyutu. Asal sayı olmalı.
nBlockSize
Parametreleri genişletmek için bellek ayırma ayrıntı düzeyini belirtir. En iyi performans için 2'lik bir güç olmalıdır.
Açıklamalar
SetStoreParams
karma tablo boyutunu ve serileştirme işlemi sırasında benzersiz nesneleri tanımlamak için kullanılan eşlemenin blok boyutunu ayarlamanıza olanak tanır.
Hiçbir nesne depolandıktan sonra veya çağrıldıktan sonra MapObject
WriteObject
çağırmamalısınızSetStoreParams
.
Örnek
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
Arşive belirtilen sayıda bayt yazar.
void Write(const void* lpBuf, INT nMax);
Parametreler
lpBuf
Arşive yazılacak verileri içeren, kullanıcı tarafından sağlanan arabelleğe işaretçi.
nMax
Arşive yazılacak bayt sayısını belirten bir tamsayı.
Açıklamalar
Arşiv baytları biçimlendirmez.
Nesnelerinizde bulunan sıradan yapıları yazmak için işlevinizin Serialize
içindeki üye işlevini kullanabilirsinizWrite
.
Örnek
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Türetilmiş sınıfın seri hale getirilmesi sırasında temel sınıfın sürüm ve sınıf bilgilerini depolamak için kullanın WriteClass
.
void WriteClass(const CRuntimeClass* pClassRef);
Parametreler
pClassRef
İstenen sınıf başvurusuna karşılık gelen yapıya yönelik bir işaretçi CRuntimeClass
.
Açıklamalar
WriteClass
temel sınıfı CArchive
için CRuntimeClass
öğesine bir başvuru yazar. Başvuruyu almak için kullanın CArchive::ReadClass
.
WriteClass
arşivlenen sınıf bilgilerinin çalışma zamanı sınıfınızla uyumlu olduğunu doğrular. Uyumlu değilse, WriteClass
bir CArchiveException
oluşturur.
Çalışma zamanı sınıfınız ve kullanmalıdırDECLARE_SERIAL
; aksi takdirde WriteClass
bir CNotSupportedException
oluşturur.IMPLEMENT_SERIAL
sınıf başvurusunun WriteClass
hem okunmasını hem de yazmasını işleyen yerine kullanabilirsinizSerializeClass
.
Örnek
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
Belirtilen CObject
öğesini arşivde depolar.
void WriteObject(const CObject* pOb);
Parametreler
pOb
Depolanmakta olan nesnenin sabit işaretçisi.
Açıklamalar
Bu işlev normalde için CObject
aşırı yüklenmiş ekleme ( <<
) işleci tarafından CArchive
çağrılır. WriteObject
, arşivlenmiş sınıfın Serialize
işlevini çağırır.
Arşivlemeyi etkinleştirmek için makroyu IMPLEMENT_SERIAL
kullanmanız gerekir. WriteObject
arşive ASCII sınıf adını yazar. Bu sınıf adı daha sonra yükleme işlemi sırasında doğrulanır. Özel kodlama düzeni, sınıfın birden çok nesnesi için sınıf adının gereksiz şekilde çoğaltılmasını engeller. Bu düzen, birden fazla işaretçinin hedefi olan nesnelerin yedekli depolanmasını da engeller.
Tam nesne kodlama yöntemi (ASCII sınıf adının varlığı dahil) bir uygulama ayrıntısıdır ve kitaplığın gelecekteki sürümlerinde değişebilir.
Not
Tüm nesnelerinizi arşivleye başlamadan önce oluşturmayı, silmeyi ve güncelleştirmeyi tamamlayın. Arşivlemeyi nesne değişikliğiyle karıştırırsanız arşiviniz bozulur.
Örnek
sınıfının CAge
tanımı için CObList::CObList
örneğine bakın.
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
Bir arabellekten nesnesiyle CArchive
ilişkili dosyaya veri yazmak için bu üye işlevini kullanın.
void WriteString(LPCTSTR lpsz);
Parametreler
lpsz
Null olarak sonlandırılan metin dizesini içeren arabelleğe yönelik bir işaretçi belirtir.
Açıklamalar
Sonlandırıcı null karakter ('\0') dosyaya yazılmaz; veya yeni bir satır otomatik olarak yazılmıştır.
WriteString
disk dolu koşulu da dahil olmak üzere çeşitli koşullara yanıt olarak bir özel durum oluşturur.
Write
da kullanılabilir, ancak null karakterde sonlandırmak yerine istenen bayt sayısını dosyaya yazar.
Örnek
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);
Ayrıca bkz.
Hiyerarşi Grafiği
CFile
Sınıf
CObject
Sınıf
CSocket
Sınıf
CSocketFile
Sınıf