CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.cpp
#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

main.cpp
#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

Soru
void ____(std::ofstream& out) const {
    out.write(reinterpret_cast<const char*>(&x), sizeof(x));
}
Cevap
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.

İleri seviye bölümündeki tüm dersler