CArchive
Kelas
Memungkinkan Anda menyimpan jaringan objek yang kompleks dalam bentuk biner permanen (biasanya penyimpanan disk) yang bertahan setelah objek tersebut dihapus.
Sintaks
class CArchive
Anggota
Konstruktor Publik
Nama | Deskripsi |
---|---|
CArchive::CArchive |
CArchive Membuat objek. |
Metode Publik
Nama | Deskripsi |
---|---|
CArchive::Abort |
Menutup arsip tanpa melemparkan pengecualian. |
CArchive::Close |
Menghapus data yang tidak ditulis dan memutuskan sambungan dari CFile . |
CArchive::Flush |
Menghapus data yang tidak ditulis dari buffer arsip. |
CArchive::GetFile |
CFile Mendapatkan penunjuk objek untuk arsip ini. |
CArchive::GetObjectSchema |
Dipanggil dari Serialize fungsi untuk menentukan versi objek yang sedang dideserialisasi. |
CArchive::IsBufferEmpty |
Menentukan apakah buffer telah dikosongkan selama proses penerimaan Windows Sockets. |
CArchive::IsLoading |
Menentukan apakah arsip sedang dimuat. |
CArchive::IsStoring |
Menentukan apakah arsip disimpan. |
CArchive::MapObject |
Tempatkan objek dalam peta yang tidak diserialisasikan ke file, tetapi yang tersedia untuk dirujuk oleh subobjek. |
CArchive::Read |
Membaca byte mentah. |
CArchive::ReadClass |
Membaca referensi kelas yang sebelumnya disimpan dengan WriteClass . |
CArchive::ReadObject |
Memanggil fungsi objek Serialize untuk dimuat. |
CArchive::ReadString |
Membaca satu baris teks. |
CArchive::SerializeClass |
Membaca atau menulis referensi kelas ke CArchive objek tergantung pada arah CArchive . |
CArchive::SetLoadParams |
Mengatur ukuran pertumbuhan array beban. Harus dipanggil sebelum objek dimuat atau sebelum MapObject atau ReadObject dipanggil. |
CArchive::SetObjectSchema |
Mengatur skema objek yang disimpan dalam objek arsip. |
CArchive::SetStoreParams |
Mengatur ukuran tabel hash dan ukuran blok peta yang digunakan untuk mengidentifikasi objek unik selama proses serialisasi. |
CArchive::Write |
Menulis byte mentah. |
CArchive::WriteClass |
Menulis referensi ke CRuntimeClass ke CArchive . |
CArchive::WriteObject |
Memanggil fungsi objek Serialize untuk menyimpan. |
CArchive::WriteString |
Menulis satu baris teks. |
Operator Publik
Nama | Deskripsi |
---|---|
CArchive::operator << |
Menyimpan objek dan jenis primitif ke arsip. |
CArchive::operator >> |
Memuat objek dan jenis primitif dari arsip. |
Anggota Data Publik
Nama | Deskripsi |
---|---|
CArchive::m_pDocument |
Keterangan
CArchive
tidak memiliki kelas dasar.
Nantinya Anda dapat memuat objek dari penyimpanan persisten, menyusunnya kembali dalam memori. Proses pembuatan data persisten ini disebut "serialisasi."
Anda dapat menganggap objek arsip sebagai semacam aliran biner. Seperti aliran input/output, arsip dikaitkan dengan file dan mengizinkan penulisan dan pembacaan data yang di-buffer ke dan dari penyimpanan. Aliran input/output memproses urutan karakter ASCII, tetapi arsip memproses data objek biner dalam format yang efisien dan tidak berlebihan.
Anda harus membuat CFile
objek sebelum dapat membuat CArchive
objek. Selain itu, Anda harus memastikan bahwa status beban/penyimpanan arsip kompatibel dengan mode buka file. Anda dibatasi untuk satu arsip aktif per file.
Saat Anda membuat CArchive
objek, Anda melampirkannya ke objek kelas CFile
(atau kelas turunan) yang mewakili file terbuka. Anda juga menentukan apakah arsip akan digunakan untuk memuat atau menyimpan. Objek CArchive
dapat memproses tidak hanya jenis primitif tetapi juga objek kelas -turunan CObject
yang dirancang untuk serialisasi. Kelas yang dapat diserialisasikan biasanya memiliki Serialize
fungsi anggota, dan biasanya menggunakan makro dan IMPLEMENT_SERIAL
, seperti yang dijelaskan di bawah kelas CObject
.DECLARE_SERIAL
Operator ekstraksi berlebih ( >>
) dan penyisipan ( <<
) adalah antarmuka pemrograman arsip yang nyaman yang mendukung jenis primitif dan CObject
kelas turunan.
CArchive
juga mendukung pemrograman dengan kelas CSocket
MFC Windows Sockets dan CSocketFile
. Fungsi anggota mendukung penggunaan tersebut IsBufferEmpty
.
Untuk informasi selengkapnya tentang CArchive
, lihat artikel Serialisasi dan Soket Windows: Menggunakan Soket dengan Arsip.
Hierarki Warisan
CArchive
Persyaratan
Header: afx.h
CArchive::Abort
Panggil fungsi ini untuk menutup arsip tanpa melemparkan pengecualian.
void Abort ();
Keterangan
CArchive
Destruktor biasanya akan memanggil Close
, yang akan menghapus data apa pun yang belum disimpan ke objek terkaitCFile
. Ini dapat menyebabkan pengecualian.
Saat menangkap pengecualian ini, ada baiknya menggunakan Abort
, sehingga merusak CArchive
objek tidak menyebabkan pengecualian lebih lanjut. Saat menangani pengecualian, CArchive::Abort
tidak akan melemparkan pengecualian pada kegagalan karena, tidak seperti CArchive::Close
, Abort
mengabaikan kegagalan.
Jika Anda terbiasa new
mengalokasikan CArchive
objek pada heap, maka Anda harus menghapusnya setelah menutup file.
Contoh
Lihat contoh untuk CArchive::WriteClass
.
CArchive::CArchive
Membuat CArchive
objek dan menentukan apakah objek akan digunakan untuk memuat atau menyimpan objek.
CArchive(
CFile* pFile,
UINT nMode,
int nBufSize = 4096,
void* lpBuf = NULL);
Parameter
pFile
Penunjuk ke CFile
objek yang merupakan sumber utama atau tujuan data persisten.
nMode
Bendera yang menentukan apakah objek akan dimuat dari atau disimpan ke arsip. Parameter nMode
harus memiliki salah satu nilai berikut:
CArchive::load
Memuat data dari arsip. HanyaCFile
memerlukan izin baca.CArchive::store
Menyimpan data ke arsip.CFile
Memerlukan izin tulis.CArchive::bNoFlushOnDelete
Mencegah arsip dipanggilFlush
secara otomatis saat destruktor arsip dipanggil. Jika Anda mengatur bendera ini, Anda bertanggung jawab untuk secara eksplisit memanggilClose
sebelum destruktor dipanggil. Jika tidak, data Anda akan rusak.
nBufSize
Bilangan bulat yang menentukan ukuran buffer file internal, dalam byte. Perhatikan bahwa ukuran buffer default adalah 4.096 byte. Jika Anda secara rutin mengarsipkan objek besar, Anda akan meningkatkan performa jika Anda menggunakan ukuran buffer yang lebih besar yang merupakan kelipatan ukuran buffer file.
lpBuf
Penunjuk opsional ke buffer ukuran nBufSize
yang disediakan pengguna . Jika Anda tidak menentukan parameter ini, arsip mengalokasikan buffer dari tumpukan lokal dan membebaskannya ketika objek dihancurkan. Arsip tidak membebaskan buffer yang disediakan pengguna.
Keterangan
Anda tidak dapat mengubah spesifikasi ini setelah membuat arsip.
Anda tidak boleh menggunakan CFile
operasi untuk mengubah status file hingga Anda menutup arsip. Setiap operasi tersebut akan merusak integritas arsip. Anda dapat mengakses posisi penunjuk file kapan saja selama serialisasi dengan mendapatkan objek file arsip dari GetFile
fungsi anggota lalu menggunakan CFile::GetPosition
fungsi . Anda harus memanggil CArchive::Flush
sebelum mendapatkan posisi penunjuk file.
Contoh
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
Menghapus data apa pun yang tersisa di buffer, menutup arsip, dan memutuskan sambungan arsip dari file.
void Close();
Keterangan
Tidak ada operasi lebih lanjut pada arsip yang diizinkan. Setelah menutup arsip, Anda dapat membuat arsip lain untuk file yang sama atau Anda dapat menutup file.
Fungsi Close
anggota memastikan bahwa semua data ditransfer dari arsip ke file, dan membuat arsip tidak tersedia. Untuk menyelesaikan transfer dari file ke media penyimpanan, Anda harus terlebih dahulu menggunakan CFile::Close
lalu menghancurkan CFile
objek.
Contoh
Lihat contoh untuk CArchive::WriteString.
CArchive::Flush
Memaksa data apa pun yang tersisa dalam buffer arsip untuk ditulis ke file.
void Flush();
Keterangan
Fungsi Flush
anggota memastikan bahwa semua data ditransfer dari arsip ke file. Anda harus memanggil CFile::Close
untuk menyelesaikan transfer dari file ke media penyimpanan.
Contoh
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
Mendapatkan penunjuk objek untuk arsip ini.
CFile* GetFile() const;
Tampilkan Nilai
Penunjuk konstan ke objek yang CFile
digunakan.
Keterangan
Anda harus menghapus arsip sebelum menggunakan GetFile
.
Contoh
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Panggil fungsi ini dari Serialize
fungsi untuk menentukan versi objek yang saat ini sedang dideserialisasi.
UINT GetObjectSchema();
Tampilkan Nilai
Selama deserialisasi, versi objek sedang dibaca.
Keterangan
Memanggil fungsi ini hanya valid ketika CArchive
objek sedang dimuat ( CArchive::IsLoading
mengembalikan bukan nol). Ini harus menjadi panggilan pertama dalam Serialize
fungsi dan hanya dipanggil sekali. Nilai pengembalian ( UINT)-1 menunjukkan bahwa nomor versi tidak diketahui.
Kelas CObject
-turunan dapat menggunakan VERSIONABLE_SCHEMA
gabungan (menggunakan bitwise "atau" (|
)) dengan versi skema itu sendiri (dalam IMPLEMENT_SERIAL
makro) untuk membuat "objek yang dapat diverifikasi," yaitu, objek yang fungsi anggotanya Serialize
dapat membaca beberapa versi. Fungsionalitas kerangka kerja default (tanpa VERSIONABLE_SCHEMA
) adalah melemparkan pengecualian ketika versi tidak cocok.
Contoh
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
Panggil fungsi anggota ini untuk menentukan apakah buffer internal objek arsip kosong.
BOOL IsBufferEmpty() const;
Tampilkan Nilai
Bukan nol jika buffer arsip kosong; jika tidak, 0.
Keterangan
Fungsi ini disediakan untuk mendukung pemrograman dengan kelas CSocketFile
MFC Windows Sockets . Anda tidak perlu menggunakannya untuk arsip yang terkait dengan CFile
objek.
Alasan penggunaan IsBufferEmpty
dengan arsip yang terkait dengan CSocketFile
objek adalah bahwa buffer arsip mungkin berisi lebih dari satu pesan atau rekaman. Setelah menerima satu pesan, Anda harus menggunakan IsBufferEmpty
untuk mengontrol perulangan yang terus menerima data hingga buffer kosong. Untuk informasi selengkapnya, lihat Receive
fungsi anggota kelas CAsyncSocket
, yang menunjukkan cara menggunakan IsBufferEmpty
.
Untuk informasi selengkapnya, lihat Soket Windows: Menggunakan Soket dengan Arsip.
CArchive::IsLoading
Menentukan apakah arsip memuat data.
BOOL IsLoading() const;
Tampilkan Nilai
Bukan nol jika arsip saat ini sedang digunakan untuk memuat; jika tidak, 0.
Keterangan
Fungsi anggota ini dipanggil oleh Serialize
fungsi kelas yang diarsipkan.
Contoh
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Menentukan apakah arsip menyimpan data.
BOOL IsStoring() const;
Tampilkan Nilai
Bukan nol jika arsip saat ini sedang digunakan untuk menyimpan; jika tidak, 0.
Keterangan
Fungsi anggota ini dipanggil oleh Serialize
fungsi kelas yang diarsipkan.
IsStoring
Jika status arsip bukan nol, maka statusnya IsLoading
adalah 0, dan sebaliknya.
Contoh
int i = 0;
if (ar.IsStoring())
ar << i;
else
ar >> i;
CArchive::MapObject
Panggil fungsi anggota ini untuk menempatkan objek di peta yang tidak benar-benar diserialisasikan ke file, tetapi yang tersedia untuk subobjek untuk dirujuk.
void MapObject(const CObject* pOb);
Parameter
pOb
Penunjuk konstan ke objek yang disimpan.
Keterangan
Misalnya, Anda mungkin tidak membuat serialisasi dokumen, tetapi Anda akan membuat serialisasi item yang merupakan bagian dari dokumen. Dengan memanggil MapObject
, Anda mengizinkan item tersebut, atau subobjek, untuk mereferensikan dokumen. Selain itu, subitem berseri dapat menserialisasikan penunjuk belakang mereka m_pDocument
.
Anda dapat memanggil MapObject
saat menyimpan dan memuat dari CArchive
objek. MapObject
menambahkan objek yang ditentukan ke struktur data internal yang dikelola oleh CArchive
objek selama serialisasi dan deserialisasi, tetapi tidak seperti ReadObject
dan WriteObject
, tidak memanggil serialisasi pada objek.
Contoh
//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
Atur ke NULL
secara default, penunjuk ini ke CDocument
dapat diatur ke apa pun yang diinginkan pengguna CArchive
instans.
CDocument* m_pDocument;
Keterangan
Penggunaan umum pointer ini adalah untuk menyampaikan informasi tambahan tentang proses serialisasi ke semua objek yang sedang diserialisasikan. Hal ini dicapai dengan menginisialisasi penunjuk dengan dokumen ( CDocument
kelas turunan) yang sedang diserialisasikan, singgahnya objek dalam dokumen dapat mengakses dokumen jika perlu. Pointer ini juga digunakan oleh COleClientItem
objek selama serialisasi.
Kerangka kerja diatur ke dokumen yang sedang diserialisasikan m_pDocument
saat pengguna mengeluarkan perintah Buka atau Simpan File. Jika Anda membuat serial dokumen kontainer Object Linking and Embedding (OLE) karena alasan selain Buka File atau Simpan, Anda harus secara eksplisit mengatur m_pDocument
. Misalnya, Anda akan melakukan ini saat membuat serial dokumen kontainer ke Clipboard.
Contoh
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 <<
Menyimpan objek yang ditunjukkan atau jenis primitif ke arsip.
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);
Tampilkan Nilai
Referensi CArchive
yang memungkinkan beberapa operator penyisipan pada satu baris.
Keterangan
Dua versi terakhir di atas khusus untuk menyimpan bilangan bulat 64-bit.
Jika Anda menggunakan IMPLEMENT_SERIAL
makro dalam implementasi kelas Anda, maka operator penyisipan kelebihan beban untuk CObject
memanggil yang dilindungi WriteObject
. Fungsi ini, pada gilirannya Serialize
, memanggil fungsi kelas.
Operator CStringT
penyisipan (<<
) mendukung pembuangan diagnostik dan penyimpanan ke arsip.
Contoh
Contoh ini menunjukkan penggunaan CArchive
operator <<
penyisipan dengan int
jenis dan long
.
long l = 5;
int i = 10;
if (ar.IsStoring())
ar << l << i;
Contoh ini menunjukkan penggunaan CArchive
operator <<
penyisipan dengan jenis .CStringT
CString s("abc");
ar << s; // Prints the value (abc)
CArchive::operator >>
Memuat objek yang ditunjukkan atau jenis primitif dari arsip.
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);
Tampilkan Nilai
Referensi CArchive
yang memungkinkan beberapa operator ekstraksi pada satu baris.
Keterangan
Dua versi terakhir di atas khusus untuk memuat bilangan bulat 64-bit.
Jika Anda menggunakan IMPLEMENT_SERIAL
makro dalam implementasi kelas Anda, maka operator ekstraksi kelebihan beban untuk CObject
memanggil fungsi yang dilindungi ReadObject
(dengan penunjuk kelas run-time nonzero). Fungsi ini, pada gilirannya Serialize
, memanggil fungsi kelas.
Operator CStringT
ekstraksi (>>
) mendukung pemuatan dari arsip.
Contoh
Contoh ini menunjukkan penggunaan CArchive
operator >>
ekstraksi dengan jenis .int
long l;
int i;
if (ar.IsLoading())
ar >> l >> i;
Contoh ini menunjukkan penggunaan CArchive
operator <<
penyisipan dan ekstraksi dan >>
dengan jenisnya CStringT
.
CString s;
if (ar.IsLoading())
ar >> s;
CArchive::Read
Membaca jumlah byte tertentu dari arsip.
UINT Read(void* lpBuf, UINT nMax);
Parameter
lpBuf
Penunjuk ke buffer yang disediakan pengguna yaitu menerima data yang dibaca dari arsip.
nMax
Bilangan bulat yang tidak ditandatangani yang menentukan jumlah byte yang akan dibaca dari arsip.
Tampilkan Nilai
Bilangan bulat yang tidak ditandatangani yang berisi jumlah byte yang benar-benar dibaca. Jika nilai yang dikembalikan kurang dari angka yang diminta, akhir file telah tercapai. Tidak ada pengecualian yang dilemparkan pada kondisi akhir file.
Keterangan
Arsip tidak menginterpretasikan byte.
Anda dapat menggunakan Read
fungsi anggota dalam fungsi Anda Serialize
untuk membaca struktur biasa yang terkandung dalam objek Anda.
Contoh
char pbRead[100];
ar.Read(pbRead, 100);
CArchive::ReadClass
Panggil fungsi anggota ini untuk membaca referensi ke kelas yang sebelumnya disimpan dengan WriteClass
.
CRuntimeClass* ReadClass(
const CRuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* pObTag = NULL);
Parameter
pClassRefRequested
Penunjuk ke CRuntimeClass
struktur yang sesuai dengan referensi kelas yang diminta. Bisa jadi NULL
.
pSchema
Penunjuk ke skema kelas run-time yang sebelumnya disimpan.
pObTag
Angka yang mengacu pada tag unik objek. Digunakan secara internal oleh implementasi ReadObject
. Hanya diekspos untuk pemrograman tingkat lanjut; pObTag
biasanya harus NULL
.
Tampilkan Nilai
Penunjuk ke CRuntimeClass
struktur.
Keterangan
Jika pClassRefRequested
tidak NULL
, ReadClass
verifikasi bahwa informasi kelas yang diarsipkan kompatibel dengan kelas runtime Anda. Jika tidak kompatibel, ReadClass
akan melempar .CArchiveException
Kelas runtime Anda harus menggunakan DECLARE_SERIAL
dan IMPLEMENT_SERIAL
; jika tidak, ReadClass
akan melempar .CNotSupportedException
Jika pSchema
adalah NULL
, skema kelas yang disimpan dapat diambil dengan memanggil CArchive::GetObjectSchema
; jika tidak, *pSchema
akan berisi skema kelas run-time yang sebelumnya disimpan.
Anda dapat menggunakan SerializeClass
alih-alih ReadClass
, yang menangani pembacaan dan penulisan referensi kelas.
Contoh
Lihat contoh untuk CArchive::WriteClass
.
CArchive::ReadObject
Membaca data objek dari arsip dan membuat objek dengan jenis yang sesuai.
CObject* ReadObject(const CRuntimeClass* pClass);
Parameter
pClass
Penunjuk konstan ke CRuntimeClass
struktur yang sesuai dengan objek yang Anda harapkan untuk dibaca.
Tampilkan Nilai
CObject
Pointer yang harus dilemparkan dengan aman ke kelas turunan yang benar dengan menggunakan CObject::IsKindOf
.
Keterangan
Fungsi ini biasanya dipanggil oleh CArchive
operator ekstraksi ( >>
) yang kelebihan beban untuk pointer CObject
. ReadObject
, pada gilirannya Serialize
, memanggil fungsi kelas yang diarsipkan.
Jika Anda menyediakan parameter nonzero pClass
, yang diperoleh oleh RUNTIME_CLASS
makro, maka fungsi memverifikasi kelas run-time objek yang diarsipkan. Ini mengasumsikan Anda telah menggunakan IMPLEMENT_SERIAL
makro dalam implementasi kelas.
Contoh
Lihat contoh untuk CArchive::WriteObject
.
CArchive::ReadString
Panggil fungsi anggota ini untuk membaca data teks ke dalam buffer dari file yang terkait dengan CArchive
objek.
BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
Parameter
rString
Referensi ke yang CString
akan berisi string yang dihasilkan setelah dibaca dari file yang terkait dengan CArchive
objek.
lpsz
Menentukan penunjuk ke buffer yang disediakan pengguna yang akan menerima string teks null-terminated.
nMax
Menentukan jumlah maksimum karakter yang akan dibaca. Harus kurang dari lpsz
ukuran buffer.
Tampilkan Nilai
Dalam versi yang mengembalikan BOOL, TRUE
jika berhasil; FALSE
jika tidak.
Dalam versi yang mengembalikan LPTSTR
, penunjuk ke buffer yang berisi data teks; NULL
jika akhir file tercapai.
Keterangan
Dalam versi fungsi anggota dengan nMax
parameter , buffer akan menahan hingga batas nMax
- 1 karakter. Pembacaan dihentikan oleh pasangan umpan kembali-baris pengangkutan. Karakter baris baru berikutnya selalu dihapus. Karakter NULL
('\0') ditambahkan dalam kedua kasus.
CArchive::Read
juga tersedia untuk input mode teks, tetapi tidak berakhir pada pasangan umpan baris kembali pengangkutan.
Contoh
Lihat contoh untuk CArchive::WriteString
.
CArchive::SerializeClass
Panggil fungsi anggota ini saat Anda ingin menyimpan dan memuat informasi versi kelas dasar.
void SerializeClass(const CRuntimeClass* pClassRef);
Parameter
pClassRef
Penunjuk ke objek kelas run-time untuk kelas dasar.
Keterangan
SerializeClass
membaca atau menulis referensi ke kelas ke CArchive
objek, tergantung pada arah CArchive
. Gunakan SerializeClass
sebagai ganti ReadClass
dan WriteClass
sebagai cara mudah untuk membuat serialisasi objek kelas dasar; SerializeClass
membutuhkan lebih sedikit kode dan lebih sedikit parameter.
Seperti ReadClass
, SerializeClass
memverifikasi bahwa informasi kelas yang diarsipkan kompatibel dengan kelas runtime Anda. Jika tidak kompatibel, SerializeClass
akan melempar .CArchiveException
Kelas runtime Anda harus menggunakan DECLARE_SERIAL
dan IMPLEMENT_SERIAL
; jika tidak, SerializeClass
akan melempar .CNotSupportedException
RUNTIME_CLASS
Gunakan makro untuk mengambil nilai untuk pRuntimeClass
parameter . Kelas dasar harus menggunakan IMPLEMENT_SERIAL
makro.
Contoh
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
Hubungi SetLoadParams
ketika Anda akan membaca sejumlah CObject
besar objek -turunan dari arsip.
void SetLoadParams(UINT nGrowBy = 1024);
Parameter
nGrowBy
Jumlah minimum slot elemen untuk dialokasikan jika peningkatan ukuran diperlukan.
Keterangan
CArchive
menggunakan array beban untuk mengatasi referensi ke objek yang disimpan dalam arsip. SetLoadParams
memungkinkan Anda mengatur ukuran pertumbuhan array beban.
Anda tidak boleh memanggil SetLoadParams
setelah objek dimuat, atau setelah MapObject
atau ReadObject
dipanggil.
Contoh
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
Panggil fungsi anggota ini untuk mengatur skema objek yang disimpan dalam objek arsip ke nSchema
.
void SetObjectSchema(UINT nSchema);
Parameter
nSchema
Menentukan skema objek.
Keterangan
Panggilan berikutnya ke GetObjectSchema
akan mengembalikan nilai yang disimpan di nSchema
.
Gunakan SetObjectSchema
untuk penerapan versi tingkat lanjut; misalnya, ketika Anda ingin memaksa versi tertentu untuk dibaca dalam Serialize
fungsi kelas turunan.
Contoh
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Gunakan SetStoreParams
saat menyimpan sejumlah CObject
besar objek -turunan dalam arsip.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Parameter
nHashSize
Ukuran tabel hash untuk peta penunjuk antarmuka. Harus nomor utama.
nBlockSize
Menentukan granularitas alokasi memori untuk memperluas parameter. Harus menjadi kekuatan 2 untuk performa terbaik.
Keterangan
SetStoreParams
memungkinkan Anda mengatur ukuran tabel hash dan ukuran blok peta yang digunakan untuk mengidentifikasi objek unik selama proses serialisasi.
Anda tidak boleh memanggil SetStoreParams
setelah objek apa pun disimpan, atau setelah MapObject
atau WriteObject
dipanggil.
Contoh
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
Menulis jumlah byte yang ditentukan ke arsip.
void Write(const void* lpBuf, INT nMax);
Parameter
lpBuf
Penunjuk ke buffer yang disediakan pengguna yang berisi data yang akan ditulis ke arsip.
nMax
Bilangan bulat yang menentukan jumlah byte yang akan ditulis ke arsip.
Keterangan
Arsip tidak memformat byte.
Anda dapat menggunakan Write
fungsi anggota dalam fungsi Anda Serialize
untuk menulis struktur biasa yang terkandung dalam objek Anda.
Contoh
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Gunakan WriteClass
untuk menyimpan informasi versi dan kelas kelas dasar selama serialisasi kelas turunan.
void WriteClass(const CRuntimeClass* pClassRef);
Parameter
pClassRef
Penunjuk ke CRuntimeClass
struktur yang sesuai dengan referensi kelas yang diminta.
Keterangan
WriteClass
menulis referensi ke CRuntimeClass
untuk kelas dasar ke CArchive
. Gunakan CArchive::ReadClass
untuk mengambil referensi.
WriteClass
memverifikasi bahwa informasi kelas yang diarsipkan kompatibel dengan kelas runtime Anda. Jika tidak kompatibel, WriteClass
akan melempar .CArchiveException
Kelas runtime Anda harus menggunakan DECLARE_SERIAL
dan IMPLEMENT_SERIAL
; jika tidak, WriteClass
akan melempar .CNotSupportedException
Anda dapat menggunakan SerializeClass
alih-alih WriteClass
, yang menangani pembacaan dan penulisan referensi kelas.
Contoh
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
Menyimpan yang ditentukan CObject
ke arsip.
void WriteObject(const CObject* pOb);
Parameter
pOb
Penunjuk konstan ke objek yang disimpan.
Keterangan
Fungsi ini biasanya dipanggil oleh CArchive
operator insertion ( <<
) kelebihan beban untuk CObject
. WriteObject
, pada gilirannya Serialize
, memanggil fungsi kelas yang diarsipkan.
Anda harus menggunakan IMPLEMENT_SERIAL
makro untuk mengaktifkan pengarsipan. WriteObject
menulis nama kelas ASCII ke arsip. Nama kelas ini divalidasi nanti selama proses pemuatan. Skema pengodean khusus mencegah duplikasi nama kelas yang tidak perlu untuk beberapa objek kelas. Skema ini juga mencegah penyimpanan objek berlebihan yang merupakan target lebih dari satu pointer.
Metode pengodean objek yang tepat (termasuk keberadaan nama kelas ASCII) adalah detail implementasi dan dapat berubah dalam versi pustaka di masa mendatang.
Catatan
Selesaikan pembuatan, penghapusan, dan pembaruan semua objek Anda sebelum Anda mulai mengarsipkannya. Arsip Anda akan rusak jika Anda mencampur pengarsipan dengan modifikasi objek.
Contoh
Untuk definisi kelas CAge
, lihat contoh untuk CObList::CObList
.
CFile myFile(_T("My__test__file.dat"),
CFile::modeCreate | CFile::modeReadWrite);
CAge age(21), *pAge;
// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);
// Write the object to the archive
arStore.WriteObject(&age);
// Close the storing archive
arStore.Close();
// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);
// Verify the object is in the archive.
pAge = (CAge *)arLoad.ReadObject(RUNTIME_CLASS(CAge));
ASSERT(age == *pAge);
CArchive::WriteString
Gunakan fungsi anggota ini untuk menulis data dari buffer ke file yang terkait dengan CArchive
objek.
void WriteString(LPCTSTR lpsz);
Parameter
lpsz
Menentukan penunjuk ke buffer yang berisi string teks null-terminated.
Keterangan
Karakter null penghentian ('\0') tidak ditulis ke file; juga bukan baris baru yang ditulis secara otomatis.
WriteString
memberikan pengecualian sebagai respons terhadap beberapa kondisi, termasuk kondisi penuh disk.
Write
juga tersedia, tetapi daripada mengakhiri karakter null, ia menulis jumlah byte yang diminta ke file.
Contoh
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);
Lihat juga
Bagan Hierarki
CFile
Kelas
CObject
Kelas
CSocket
Kelas
CSocketFile
Kelas