Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Lima langkah utama diperlukan untuk membuat kelas dapat diserialisasikan. Mereka tercantum di bawah ini dan dijelaskan di bagian berikut:
Mengambil kelas Anda dari CObject (atau dari beberapa kelas yang berasal dari
CObject).Menggunakan makro DECLARE_SERIAL dalam deklarasi kelas.
Menggunakan makro IMPLEMENT_SERIAL dalam file implementasi untuk kelas Anda.
Jika Anda memanggil Serialize secara langsung, bukan melalui operator >> dan << dari CArchive, tiga langkah terakhir tidak diperlukan untuk serialisasi.
Mengambil Kelas Anda dari CObject
Protokol dan fungsionalitas serialisasi dasar didefinisikan di CObject kelas . Dengan turunan kelas Anda dari CObject (atau dari kelas yang berasal dari CObject), seperti yang ditunjukkan dalam deklarasi kelas CPersonberikut , Anda mendapatkan akses ke protokol serialisasi dan fungsionalitas CObject.
Mengesampingkan Fungsi Anggota Serialisasi
Fungsi anggota Serialize, yang didefinisikan di kelas CObject, bertugas untuk menserialisasikan data yang diperlukan untuk menangkap status objek saat ini. Fungsi Serialize ini memiliki CArchive argumen yang digunakannya untuk membaca dan menulis data objek. Objek CArchive memiliki fungsi anggota, IsStoring, yang menunjukkan apakah Serialize menyimpan (menulis data) atau memuat (membaca data). Dengan menggunakan hasil IsStoring sebagai panduan, Anda memasukkan data objek ke dalam CArchive objek dengan operator penyisipan (<<) atau mengekstrak data dengan operator ekstraksi (>>).
Pertimbangkan kelas yang berasal dari CObject dan memiliki dua variabel anggota baru, dari jenis CString dan WORD. Fragmen deklarasi kelas berikut menunjukkan variabel anggota baru dan deklarasi untuk fungsi anggota yang diambil alih Serialize.
class CPerson : public CObject
{
public:
DECLARE_SERIAL(CPerson)
// empty constructor is necessary
CPerson();
virtual ~CPerson();
CString m_name;
WORD m_number;
void Serialize(CArchive& archive);
};
Untuk mengambil alih fungsi anggota Serialize
Panggil versi
Serializekelas dasar Anda untuk memastikan bahwa bagian objek yang diwariskan diserialisasikan.Sisipkan atau ekstrak variabel anggota khusus untuk kelas Anda.
Operator penyisipan dan ekstraksi berinteraksi dengan kelas arsip untuk membaca dan menulis data. Contoh berikut menunjukkan cara menerapkan
Serializepada kelasCPersonyang dinyatakan di atas.void CPerson::Serialize(CArchive& archive) { // call base class function first // base class is CObject in this case CObject::Serialize(archive); // now do the stuff for our specific class if (archive.IsStoring()) archive << m_name << m_number; else archive >> m_name >> m_number; }
Anda juga dapat menggunakan fungsi anggota CArchive::Read dan CArchive::Write untuk membaca dan menulis sejumlah besar data yang tidak bertipe.
Menggunakan Makro DECLARE_SERIAL
Makro DECLARE_SERIAL diperlukan dalam deklarasi kelas yang akan mendukung serialisasi, seperti yang ditunjukkan di sini:
class CPerson : public CObject
{
public:
DECLARE_SERIAL(CPerson)
Menentukan Konstruktor tanpa Argumen
MFC memerlukan konstruktor default saat membuat ulang objek Anda saat dideserialisasi (dimuat dari disk). Proses deserialisasi akan mengisi semua variabel anggota dengan nilai yang diperlukan untuk membuat ulang objek.
Konstruktor ini dapat dinyatakan publik, dilindungi, atau privat. Jika Anda membuatnya terlindungi atau privat, Anda membantu memastikan bahwa itu hanya akan digunakan oleh fungsi serialisasi. Konstruktor harus menempatkan objek dalam keadaan yang memungkinkannya dihapus jika perlu.
Nota
Jika Anda lupa menentukan konstruktor tanpa argumen di kelas yang menggunakan makro DECLARE_SERIAL dan IMPLEMENT_SERIAL, Anda akan mendapatkan peringatan kompilator "tidak ada konstruktor default yang tersedia" pada baris tempat makro IMPLEMENT_SERIAL digunakan.
Menggunakan Makro IMPLEMENT_SERIAL dalam File Implementasi
Makro IMPLEMENT_SERIAL digunakan untuk menentukan berbagai fungsi yang diperlukan ketika Anda memperoleh kelas yang dapat diserialisasikan dari CObject. Anda menggunakan makro ini dalam file implementasi (. CPP) untuk kelas Anda. Dua argumen pertama untuk makro adalah nama kelas dan nama kelas dasar langsungnya.
Argumen ketiga untuk makro ini adalah angka skema. Nomor skema pada dasarnya adalah nomor versi untuk objek kelas. Gunakan bilangan bulat yang lebih besar dari atau sama dengan 0 untuk angka skema. (Jangan membingungkan nomor skema ini dengan terminologi database.)
Kode serialisasi MFC memeriksa nomor skema saat membaca objek ke dalam memori. Jika nomor skema objek pada disk tidak cocok dengan nomor skema kelas dalam memori, pustaka akan melempar CArchiveException, mencegah program Anda membaca versi objek yang salah.
Jika Anda ingin fungsi anggota Anda Serialize dapat membaca beberapa versi — yaitu, file yang ditulis dengan versi aplikasi yang berbeda — Anda dapat menggunakan nilai VERSIONABLE_SCHEMA sebagai argumen untuk makro IMPLEMENT_SERIAL. Untuk informasi penggunaan dan contoh, lihat GetObjectSchema fungsi anggota kelas CArchive.
Contoh berikut menunjukkan cara menggunakan IMPLEMENT_SERIAL untuk kelas, CPerson, yang berasal dari CObject:
IMPLEMENT_SERIAL(CPerson, CObject, 1)
Setelah Anda memiliki kelas yang dapat diserialisasikan, Anda dapat membuat serialisasi objek kelas, seperti yang dibahas dalam artikel Serialisasi: Serialisasi Objek.