Custom serileştirme
- C++ kursu
- İleri seviye
- Ders 53/83
- 5 dk
Kendi serileştirme kodunu yazmayı öğrenirsin.
Custom serileştirme nedir?
Custom serileştirme, bir yapı için serialize ve deserialize metotlarını kendin yazmandır. Her alanı sırayla yazıp okursun; böylece biçim üzerinde tam denetim sağlarsın. Bu, binary ve text yöntemlerinin esnek bir birleşimidir.
Örnek: struct Point { int x; int y; void serialize(std::ofstream& ofs) const { ofs.write(...); } };. serialize metodu const yapılır çünkü nesneyi değiştirmez. Geri okuma için ayrı bir deserialize(std::ifstream&) metodu yazılır. Bu yaklaşım, hata denetimi ve sürüm mantığını serileştirmeye dahil etmeyi kolaylaştırır.
deserialize metodu
deserialize metodu serileştirilmiş veriyi geri okur ve nesnenin alanlarına yazar. serialize ile aynı sırayı kullanmalıdır; sıra farklıysa veri bozuk okunur.
Örnek: void deserialize(std::ifstream& ifs) { ifs.read(reinterpret_cast<char*>(&x), sizeof(x)); ifs.read(reinterpret_cast<char*>(&y), sizeof(y)); }. Burada serialize önce x'i yazmıştı, bu yüzden deserialize da önce x'i okur. Bu eşleşme, veri bütünlüğü için zorunludur. İki metot birlikte çalışır: biri yazar, diğeri okur.
Uygulama Point yapısı için custom serileştirme
struct Point { int x; int y; void serialize(std::ofstream& ofs) const; }; tanımla. serialize metodu ofs.write(reinterpret_cast<const char*>(&x), sizeof(x)) ve aynı şeyi y için yapsın. main içinde Point p{3, 4} oluştur, std::ofstream ile p.serialize(ofs) çağır. Geri oku ve std::cout << loaded.x << "," << loaded.y; yazdır.
Başlangıç kodu
#include <iostream>
#include <fstream>
// Point yapısını ve serialize metodunu tanımla
int main() {
// Noktayı dosyaya yaz ve geri oku
return 0;
}Örnek çözüm
#include <iostream>
#include <fstream>
struct Point {
int x;
int y;
void serialize(std::ofstream& ofs) const {
ofs.write(reinterpret_cast<const char*>(&x), sizeof(x));
ofs.write(reinterpret_cast<const char*>(&y), sizeof(y));
}
};
int main() {
Point p{3, 4};
std::ofstream ofs("point.bin", std::ios::binary);
p.serialize(ofs);
ofs.close();
Point loaded{0, 0};
std::ifstream ifs("point.bin", std::ios::binary);
ifs.read(reinterpret_cast<char*>(&loaded.x), sizeof(loaded.x));
ifs.read(reinterpret_cast<char*>(&loaded.y), sizeof(loaded.y));
ifs.close();
std::cout << loaded.x << "," << loaded.y;
return 0;
}Beklenen çıktı
3,4
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 serialize metodunu tamamla
void ____(std::ofstream& out) const {
out.write(reinterpret_cast<const char*>(&x), sizeof(x));
}
void serialize(std::ofstream& out) const {
out.write(reinterpret_cast<const char*>(&x), sizeof(x));
}
Açıklama: serialize metodu x alanını ikili olarak yazar.
2 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
void serialize(ofs) const |
Yazar |
void deserialize(ifs) |
Okur |
const |
Nesneyi değiştirmez |
sizeof(x) |
Bayt boyutu |
3 serialize ve deserialize neyi paylaşmalı?
- Aynı işletim sistemini
- Aynı alan sırasını Doğru cevap
- Aynı dosya adını
- Aynı derleyiciyi
Açıklama: serialize ve deserialize aynı alan sırasını kullanmalıdır.