Aracılığıyla paylaş


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ı CFilekeser.
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 WriteClassdepolanan 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 CArchivebağ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 CArchivebir 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 CObjectnesnelerini de işleyebilir. Serileştirilebilir bir sınıfın genellikle bir Serialize üye işlevi vardır ve genellikle sınıfı CObjectaltı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 CObjecthem de türetilmiş sınıfları destekleyen kullanışlı arşiv programlama arabirimleridir.

CArchive ayrıca MFC Windows Yuva sınıfları CSocket ve CSocketFileile programlamayı da destekler. IsBufferEmpty Üye işlevi bu kullanımı destekler.

hakkında CArchivedaha 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 Closebulunur 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 Abortiyi bir fikirdir. Özel durumları işlerken, CArchive::Abort hatalarda bir özel durum oluşturmaz çünkü , aksine CArchive::CloseAbort hataları yoksayar.

Nesneyi yığında ayırmak CArchive için kullandıysanıznew, dosyayı kapattıktan sonra silmeniz gerekir.

Örnek

örneğine CArchive::WriteClassbakı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ızca CFile 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ğırmaktan Close 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 nBufSizearabelleğ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.

CObjectTü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ı CSocketFileile 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ı IsBufferEmptygö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ı MapObjectyaparak, 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. MapObjectbelirtilen 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 CDocumentsı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_pDocumentgerekir. Ö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 WriteClassdepolanan 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ı ReadObjecttarafı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

NULLdeğ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 CArchiveExceptionoluşturur.

Çalışma zamanı sınıfınız ve kullanmalıdırDECLARE_SERIAL; aksi takdirde ReadClass bir CNotSupportedExceptionoluşturur.IMPLEMENT_SERIAL

ise pSchema NULL, depolanan sınıfın şeması çağrılarak CArchive::GetObjectSchemaalı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 ReadClasshem okunmasını hem de yazmasını işleyen yerine kullanabilirsinizSerializeClass.

Örnek

örneğine CArchive::WriteClassbakı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::IsKindOfdoğ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::WriteObjectbakı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 LPTSTRsü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::WriteStringbakı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

SerializeClassnesnesinin yönüne CArchivebağ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 CArchiveExceptionoluşturur.

Çalışma zamanı sınıfınız ve kullanmalıdırDECLARE_SERIAL; aksi takdirde SerializeClass bir CNotSupportedExceptionoluş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 CObjecttü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 nSchemabu ü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 nSchemadepolanan 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 CObjecttü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

WriteClasstemel sınıfı CArchiveiç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 CArchiveExceptionoluşturur.

Çalışma zamanı sınıfınız ve kullanmalıdırDECLARE_SERIAL; aksi takdirde WriteClass bir CNotSupportedExceptionoluşturur.IMPLEMENT_SERIAL

sınıf başvurusunun WriteClasshem 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 CObjectaşı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 CAgetanı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