CodeBlanks Logo Icon CodeBlanks

Versioning

Serileştirme versioning ve uyumluluk öğrenirsin.

Versioning nedir?

Versioning, serileştirilmiş veriye bir sürüm numarası ekleyerek ileride uyumluluk sağlamaktır. Veri biçimi değiştiğinde eski dosyaları okumak için sürüm kontrolü yapılır ve gerekiyorsa veri göçü (migration) uygulanır.

Örnek: dosyaya önce int version = 1; yazarsın, sonra asıl veriyi. Geri okurken önce sürümü okursun ve if (version == 1) ile o sürüme uygun okuma yaparsın. Daha sonra biçimi değiştirip version = 2 yaparsan, eski dosyaları da version == 1 dalından okuyabilirsin. Bu, geriye dönük uyumluluğu (backward compatibility) sağlar.

Sürüm denetimi ve göç

Geri okurken önce sürüm numarasını okursun. Sonra if / else if ile her sürüm için ayrı bir okuma dalı yazarsın. Yeni sürüm eklediğinde, eski sürüm dalını korur ve yeni dalı eklersin.

Örnek: if (version == 1) { ifs.read(...); } ve else if (version == 2) { ifs.read(...); /* yeni alan */ }. Sürüm 1 dosyaları ilk daldan, sürüm 2 dosyaları ikinci daldan okunur. Böylece hem eski hem yeni dosyalar aynı programla çalışır. Göç (migration), eski veriyi yeni biçime çevirme mantığıdır; bu dallar içinde yapılır.

Uygulama Sürümlü ikili dosya yaz ve oku

İki blok yaz. İlk blokta int version = 1; ve int value = 42; tanımla, std::ofstream ofs("data.bin", std::ios::binary) ile ikisini ofs.write ile yaz. İkinci blokta int version = 0; int value = 0; tanımla, std::ifstream ifs("data.bin", std::ios::binary) ile ikisini ifs.read ile oku. if (version == 1) ile std::cout << "v1: " << value; yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <fstream>

// Sürüm ve değeri ikili dosyaya yaz, geri oku ve sürümü denetle

int main() {
    // write, read ve sürüm denetimi ekle
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <fstream>

int main() {
    {
        int version = 1;
        int value = 42;
        std::ofstream ofs("data.bin", std::ios::binary);
        ofs.write(reinterpret_cast<const char*>(&version), sizeof(version));
        ofs.write(reinterpret_cast<const char*>(&value), sizeof(value));
    }
    {
        int version = 0;
        int value = 0;
        std::ifstream ifs("data.bin", std::ios::binary);
        ifs.read(reinterpret_cast<char*>(&version), sizeof(version));
        ifs.read(reinterpret_cast<char*>(&value), sizeof(value));
        if (version == 1) {
            std::cout << "v1: " << value;
        }
    }
    return 0;
}

Beklenen çıktı

v1: 42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Parçayı rolüne eşle

Kavram Anlamı
int version = 1 Sürüm numarası
if (version == 1) Sürüm denetimi
version = 2 Yeni biçim
migration Eski veriyi göç ettirir

2 Sürüm numarası neden yazılır?

  • Dosyayı küçültmek için
  • Çıktıyı renklendirmek için
  • Derlemeyi hızlandırmak için
  • Geriye dönük uyumluluk için Doğru cevap

Açıklama: Sürüm numarası, eski dosyaları yeni programda okumayı sağlar.

3 Sürüm değişkenini tamamla

Soru
int ____ = 1;
Cevap
int version = 1;

Açıklama: int version = 1; sürüm numarasını belirler.

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