C++
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Parçayı rolüne eşle
- int version = 1
- Sürüm numarası
- if (version == 1)
- Sürüm denetimi
- version = 2
- Yeni biçim
- migration
- Eski veriyi göç ettirir
-
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
Cevabı göster
Geriye dönük uyumluluk için — Sürüm numarası, eski dosyaları yeni programda okumayı sağlar.
-
Sürüm değişkenini tamamla
int ____ = 1;
Cevabı göster
int version = 1;
Sıradaki ders: Custom serileştirme