C++
Custom serileştirme
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
serialize metodunu tamamla
void ____(std::ofstream& out) const {
out.write(reinterpret_cast<const char*>(&x), sizeof(x));
}
Cevabı göster
void serialize(std::ofstream& out) const {
out.write(reinterpret_cast<const char*>(&x), sizeof(x));
}
-
Parçayı rolüne eşle
- void serialize(ofs) const
- Yazar
- void deserialize(ifs)
- Okur
- const
- Nesneyi değiştirmez
- sizeof(x)
- Bayt boyutu
-
serialize ve deserialize neyi paylaşmalı?
- Aynı işletim sistemini
- Aynı alan sırasını
- Aynı dosya adını
- Aynı derleyiciyi
Cevabı göster
Aynı alan sırasını — serialize ve deserialize aynı alan sırasını kullanmalıdır.
Sıradaki ders: Özet - Serileştirme