Sobes.tech
Junior

Serileştirme kaç türe ayrılabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Serileştirme, verilerin temsil edilme biçimine göre aşağıdaki temel türlere ayrılabilir:

  • Metin tabanlı: Veriler okunabilir bir formatta, genellikle dizgeler halinde temsil edilir.

    • Avantajlar: Hata ayıklama kolaylığı, mimariden bağımsızlık.
    • Dezavantajlar: Daha fazla veri hacmi, ayrıştırma gerekliliği.
    • Örnekler: JSON, XML, YAML.
  • İkili: Veriler ham, ikili bir formatta temsil edilir.

    • Avantajlar: Sıkıştırma, yüksek hızda serileştirme/deserileştirme.
    • Dezavantajlar: Şema olmadan veri okuma zor, farklı mimariler arasında uyumluluk sorunları (örneğin, endianness).
    • Örnekler: Protocol Buffers, Apache Thrift, Cap'n Proto, MessagePack.

Ayrıca, serileştirme uygulama yöntemine göre sınıflandırılabilir:

  • Elle: Geliştirici, nesne verilerini baytlara dönüştürmek ve tersini yapmak için açıkça kod yazar.

    • Örnek:
    // Elle serileştirme örneği int
    int data = 12345;
    std::vector<char> buffer;
    buffer.resize(sizeof(int));
    std::memcpy(buffer.data(), &data, sizeof(int));
    
  • Otomatik (yansıma/kod üretimi): Veri yapısı bilgisine dayanarak otomatik olarak serileştirme/deserileştirme yapan kütüphaneler veya araçlar kullanılır.

    • Örnek: Boost.Serialization, cereal, RapidJSON (kullanıcı tanımlı adaptörlerle), veya Protocol Buffers için kod üretim araçları.
    // boost::serialization kullanımı örneği
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/archive/binary_iarchive.hpp>
    #include <fstream>
    #include <iostream>
    
    struct MyData {
        int x;
        double y;
    
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & x;
            ar & y;
        }
    };
    
    void save(const MyData& data, const std::string& filename) {
        std::ofstream ofs(filename);
        boost::archive::binary_oarchive oa(ofs);
        oa << data;
    }
    
    void load(MyData& data, const std::string& filename) {
        std::ifstream ifs(filename);
        boost::archive::binary_iarchive ia(ifs);
        ia >> data;
    }
    

Ayrıca, dikkate alınması gerekenler:

  • Şema vs Şemasız: Veri yapısının açıkça tanımlanması (şema) gerekiyor mu yoksa veri formatı kendini açıklıyor mu?
  • Akış tabanlı vs Buffer'lı: Serileştirme, alınan verilerle birlikte mi gerçekleşebilir yoksa tüm veri hacmi bellekte olmalı mı?