Seri hale getirme: seri hale getirilebilir bir sınıf oluşturma
Seri hale getirilebilir bir sınıf oluşturmak için beş ana adımları gereklidir. Aşağıda listelenmiş ve aşağıdaki bölümlerde açıklanmıştır:
CObject kendi sınıf türetmek (ya da bazı sınıfından türetilen CObject).
Serialize üye işlevi geçersiz kılma.
DECLARE_SERIAL makrosunu kullanarak Sınıf bildirimindeki.
Hiçbir baðýmsýz deðiþken almaz yapıcı tanımlama.
Uygulama dosyasında IMPLEMENT_SERIAL makro kullanarak sınıfınız için.
Çağırırsanız, Serialize doğrudan yerine ile >> ve << işleçler, CArchive, son üç adımı seri hale getirme için gerekli değildir.
CObject kendi sınıf türetmek
Temel seri hale getirme protokolü ve işlevselliği tanımlanır CObject sınıfı. Kendi sınıfından türeyen tarafından CObject (veya türetilen bir sınıfı CObject) aşağıdaki sınıf bildiriminde gösterildiği gibi CPerson, serileştirme iletişim kuralı ve işlevlerine erişim CObject.
Geçersiz kılma üye işlev seri hale getirilmeye
Serialize İçinde tanımlanan üye işlev CObject sınıfı, bir nesnenin geçerli durumu yakalamak gerekli verileri gerçekte seri hale getirilirken için sorumludur. Serialize İşlevine sahip bir CArchive nesne veri okumak ve yazmak için kullandığı bağımsız değişkeni. CArchive nesne olan bir üye işlev IsStoring, gösterir olup olmadığını Serialize depolama (veri yazma) veya (veri okuma) yükleniyor. Sonuçlarını kullanarak IsStoring bir kılavuz olarak ya da sizin nesnenin veri eklediğiniz CArchive nesne ekleme işlecini (<<) veya veri ayıklama operatörüyle ayıklamak (>>).
Den türetilen bir sınıfı dikkate CObject ve türleri iki yeni üye değişkeni CString ve word. Aşağıdaki sınıf bildirimi parçası yeni üye değişkenleri ve geçersiz kılınmış bildirimi gösterir Serialize üye işlevi:
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 );
};
Serialize üye işlevi geçersiz kılmak için
Temel sınıf sürümü çağrısı Serialize devralınan bölümünü nesne seri hale getirilmiş olduğundan emin olmak için.
Eklemek veya sınıfı özel üye değişkenleri ayıklayın.
Ekleme ve çıkarma işleçleri veri okumak ve yazmak için arşiv sınıfla etkileşim. Aşağıdaki örnek, nasıl uygulanacağını gösterir Serialize için CPerson class bildirilen yukarıda:
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 CArchive::Read ve CArchive::Write üye işlevleri büyük miktarda untyped veri yazmak ve okumak.
DECLARE_SERIAL makro kullanma
DECLARE_SERIAL Aşağıda gösterildiği gibi makro seri hale getirme, destekleyen sınıflar bildiriminde gereklidir:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
Yapıcısını argüman olmadan tanımlama
mfc (diskten yüklenir) bunlar serisi gibi nesneleri yeniden oluşturur bir varsayılan kurucu gerektirir. Seri kaldırma işlemi tüm üye değişkenleri nesneyi yeniden oluşturmak için gerekli değerlerle doldurur.
Bu Oluşturucu public, protected ya da özel olarak bildirilebilir. Korunan veya özel değişiklik yaparsanız, yalnızca seri hale getirme işlevleri tarafından kullanılmasını sağlanmasına yardımcı olur. Yapıcı, gerekirse silinmesine izin veren bir durumda nesne konulmalıdır.
Not
Kullanan bir sınıfın yapıcısını argüman olmadan tanımlamak unutursanız, DECLARE_SERIAL ve IMPLEMENT_SERIAL makrolar aldığınız "kullanılabilir hiçbir varsayılan kurucu" Derleyici uyarı satırında nerede IMPLEMENT_SERIAL makro kullanılır.
Uygulama dosyasında IMPLEMENT_SERIAL makro kullanma
IMPLEMENT_SERIAL Makro olduğunda, türetmek seri hale getirilebilir bir sınıftan çeşitli işlevleri tanımlamak için kullanılan CObject. Uygulama dosyasında bu makroyu kullanmak (.cpp) sınıfınız için. İlk iki makro sınıfın adını ve hemen kendi temel sınıf adını değişkenlerdir.
Üçüncü bağımsız değişken bu makro için bir şema sayıdır. Aslında bu sınıfın nesneleri için bir sürüm numarası şema numarasıdır. Sıfıra eşit veya sıfırdan büyük bir tamsayı şema numarası kullanın. (Bu şema sayı veritabanı terminoloji ile karıştırmayın.)
mfc seri hale getirme kodu belleğe nesneleri okurken şema numarasını denetler. Şema nesnesi disk üzerindeki bellek sınıfında şema sayısı eşleşmiyor, kitaplık yaratacak bir CArchiveException, programınızın nesne sürümü yanlış okumanıza engel.
İsterseniz sizin Serialize birden çok sürümü görebilmek için üye işlev — başka bir deyişle, uygulama farklı sürümleri yazılmış dosyaları — değerini kullanabilirsiniz VERSIONABLE_SCHEMA bağımsız değişken olarak IMPLEMENT_SERIAL makro. Kullanım bilgileri ve örnek için bkz: GetObjectSchema sınıfının üye işlev CArchive.
Aşağıdaki örnek, nasıl kullanılacağını gösterir IMPLEMENT_SERIAL bir sınıf için CPerson, yani türetilen CObject:
IMPLEMENT_SERIAL( CPerson, CObject, 1 )
Seri seri hale getirilebilir bir sınıf olduktan sonra nesne sınıfının makalesinde açıklandığı gibi hale seri hale getirme: nesne seri hale getirilirken.