Bagikan melalui


Serialisasi: Membuat Kelas yang Dapat Diserialisasi

Lima langkah utama diperlukan untuk membuat kelas dapat diserialisasikan. Mereka tercantum di bawah ini dan dijelaskan di bagian berikut:

  1. Mengambil kelas Anda dari CObject (atau dari beberapa kelas yang berasal dari CObject).

  2. Mengesampingkan fungsi anggota Serialize.

  3. Menggunakan makro DECLARE_SERIAL dalam deklarasi kelas.

  4. Menentukan konstruktor yang tidak mengambil argumen.

  5. 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

  1. Panggil versi Serialize kelas dasar Anda untuk memastikan bahwa bagian objek yang diwariskan diserialisasikan.

  2. 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 Serialize pada kelas CPerson yang 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.

Lihat juga

Serialisasi