Sobes.tech
Junior

Na koje vrste se može podeliti serializacija?

sobes.tech АИ

Одговор од АИ

Serijalizacija se može podeliti na sledeće osnovne vrste na osnovu načina prikaza podataka:

  • Tekstualna: Podaci se prikazuju u čitljivom formatu, najčešće kao nizovi.

    • Prednosti: Lako otklanjanje grešaka, nezavisnost od arhitekture.
    • Nedostaci: Veći obim podataka, potreba za parsiranjem.
    • Primeri: JSON, XML, YAML.
  • Binarna: Podaci se prikazuju u sirovom, binarnom formatu.

    • Prednosti: Kompaktnost, visoka brzina serializacije/deserializacije.
    • Nedostaci: Čitanje podataka je otežano bez šeme, mogući problemi sa kompatibilnošću između različitih arhitektura (npr. endianness).
    • Primeri: Protocol Buffers, Apache Thrift, Cap'n Proto, MessagePack.

Pored toga, serializacija se može klasifikovati po načinu primene:

  • Ručno: Programer eksplicitno piše kod za pretvaranje podataka objekta u bajtove i nazad.

    • Primer:
    // Primer ručne serializacije int
    int data = 12345;
    std::vector<char> buffer;
    buffer.resize(sizeof(int));
    std::memcpy(buffer.data(), &data, sizeof(int));
    
  • Automatski (refleksija/kod generisanje): Koriste se biblioteke ili alati koji automatski vrše serializaciju/deserializaciju na osnovu informacija o strukturi podataka.

    • Primer: Korišćenje biblioteka poput Boost.Serialization, cereal, RapidJSON (sa prilagođenim adapterima), ili alata za generisanje koda za Protocol Buffers.
    // Primer korišćenja boost::serialization
    #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;
    }
    

Važno je takođe uzeti u obzir:

  • Šematska vs bezšemska: Da li je potrebno eksplicitno definisati strukturu podataka (šema) ili je format samopisan.
  • Tokovna vs baferisana: Da li serializacija može da se vrši tokom primanja podataka ili je potreban ceo obim podataka u memoriji pre serializacije/deserializacije.