Seri hale getirme: Seri Hale Getirilebilir Bir Sınıf Yapma
Bir sınıfı seri hale getirmek için beş ana adım gereklidir. Bunlar aşağıda listelenmiştir ve aşağıdaki bölümlerde açıklanmıştır:
Sınıfınızı CObject'ten (veya öğesinden türetilen bir sınıftan
CObject
) türetmeÜye serileştirme işlevini geçersiz kılma.
Bağımsız değişken içermeyen bir oluşturucu tanımlama.
Sınıfınız için uygulama dosyasındaki IMPLEMENT_SERIAL makroyu kullanma.
CArchive ve << işleçleri yerine >> doğrudan çağırırsanızSerialize
, serileştirme için son üç adım gerekli değildir.
Sınıfınızı CObject'ten Türetme
Temel serileştirme protokolü ve işlevselliği sınıfında CObject
tanımlanır. sınıfınızın aşağıdaki bildiriminde gösterildiği gibi sınıfından CObject
(veya öğesinden CObject
türetilmiş bir sınıftan CPerson
) türeterek, serileştirme protokolüne ve işlevselliğine CObject
erişim elde edebilirsiniz.
Üye İşlevini SeriLeştirmeyi Geçersiz Kılma
Serialize
sınıfında tanımlanan üye işlevi, bir nesnenin CObject
geçerli durumunu yakalamak için gereken verileri gerçekten seri hale getirmekle sorumludur. İşlev, Serialize
nesne verilerini okumak ve yazmak için kullandığı bir CArchive
bağımsız değişkene sahiptir. CArchive nesnesinin depolama IsStoring
(veri yazma) veya yükleme (veri okuma) durumunu Serialize
belirten bir üye işlevi vardır. sonuçlarını IsStoring
kılavuz olarak kullanarak, ekleme işleci () ile nesnenizin verilerini nesneye CArchive
eklersiniz veya ayıklama işleci (<<>>) ile verileri ayıklarsınız.
türünden türetilmiş CObject
ve iki yeni üye değişkenine CString
ve WORD'e sahip bir sınıf düşünün. Aşağıdaki sınıf bildirimi parçası, yeni üye değişkenlerini ve geçersiz kılınan Serialize
üye işlevinin bildirimini gösterir:
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);
};
Üye serileştirme işlevini geçersiz kılmak için
Nesnenin devralınan bölümünün seri hale getirildiğinden emin olmak için temel sınıf sürümünüzü
Serialize
çağırın.Sınıfınıza özgü üye değişkenlerini ekleyin veya ayıklayın.
Ekleme ve ayıklama işleçleri, verileri okumak ve yazmak için arşiv sınıfıyla etkileşim kurar. Aşağıdaki örnek, yukarıda bildirilen sınıf için
CPerson
uygulamanınSerialize
nasıl yapılacağını gösterir: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; }
Ayrıca, büyük miktarlarda yazılmamış verileri okumak ve yazmak için CArchive::Read ve CArchive::Write üye işlevlerini de kullanabilirsiniz.
DECLARE_SERIAL Makroyu Kullanma
DECLARE_SERIAL makro, burada gösterildiği gibi serileştirmeyi destekleyecek sınıfların bildiriminde gereklidir:
class CPerson : public CObject
{
public:
DECLARE_SERIAL(CPerson)
Bağımsız Değişken Olmadan Oluşturucu Tanımlama
MFC, seri durumdan çıkarıldığı (diskten yüklenen) nesnelerinizi yeniden oluşturduğunda varsayılan bir oluşturucu gerektirir. Seri durumdan çıkarma işlemi, tüm üye değişkenlerini nesneyi yeniden oluşturmak için gereken değerlerle doldurur.
Bu oluşturucu genel, korumalı veya özel olarak bildirilebilir. Korumalı veya özel olmasını sağlarsanız, yalnızca serileştirme işlevleri tarafından kullanılacağından emin olmanıza yardımcı olursunuz. Oluşturucu, nesneyi gerekirse silinmesine izin veren bir duruma getirmelidir.
Dekont
DECLARE_SERIAL ve IMPLEMENT_SERIAL makroları kullanan bir sınıfta bağımsız değişken içermeyen bir oluşturucu tanımlamayı unutursanız, IMPLEMENT_SERIAL makronun kullanıldığı satırda "varsayılan oluşturucu yok" derleyici uyarısı alırsınız.
Uygulama Dosyasında IMPLEMENT_SERIAL Makroyu Kullanma
IMPLEMENT_SERIAL makro, 'den CObject
serileştirilebilir bir sınıf türetdiğinizde gereken çeşitli işlevleri tanımlamak için kullanılır. Bu makroyu uygulama dosyasında (. CPP) öğesini seçin. Makronun ilk iki bağımsız değişkeni sınıfın adı ve hemen temel sınıfının adıdır.
Bu makronun üçüncü bağımsız değişkeni bir şema numarasıdır. Şema numarası temelde sınıfın nesneleri için bir sürüm numarasıdır. Şema numarası için 0'dan büyük veya buna eşit bir tamsayı kullanın. (Bu şema numarasını veritabanı terminolojisiyle karıştırmayın.)
MFC serileştirme kodu, nesneleri belleğe okurken şema numarasını denetler. Diskteki nesnenin şema numarası bellekteki sınıfın şema numarasıyla eşleşmiyorsa, kitaplık bir CArchiveException
oluşturur ve programınızın nesnenin yanlış bir sürümünü okumasını engeller.
Üye işlevinizin Serialize
uygulamanın farklı sürümleriyle yazılmış birden çok sürümü okuyabilmesini istiyorsanız, IMPLEMENT_SERIAL makrosunun bağımsız değişkeni olarak VERSIONABLE_SCHEMA değerini kullanabilirsiniz. Kullanım bilgileri ve bir örnek için sınıfının üye işlevine CArchive
bakınGetObjectSchema
.
Aşağıdaki örnekte, CPerson
öğesinden CObject
türetilen bir sınıf için IMPLEMENT_SERIAL nasıl kullanılacağı gösterilmektedir:
IMPLEMENT_SERIAL(CPerson, CObject, 1)
Seri hale getirilebilir bir sınıfınız olduğunda, Serileştirme: Bir Nesneyi Seri Hale Getirme makalesinde açıklandığı gibi sınıfın nesnelerini seri hale getirebilirsiniz.