Sobes.tech
Junior

Na aké druhy možno rozdeliť serializáciu?

sobes.tech AI

Odpoveď od AI

Serializáciu možno rozdeliť na nasledujúce základné druhy na základe spôsobu zobrazenia údajov:

  • Textová: Dáta sú zobrazené v čitateľnom formáte, najčastejšie vo forme reťazcov.

    • Výhody: Jednoduché ladenie, nezávislosť od architektúry.
    • Nevýhody: Väčšia veľkosť dát, potreba parsovania.
    • Príklady: JSON, XML, YAML.
  • Binárna: Dáta sú zobrazené v surovom, binárnom formáte.

    • Výhody: Kompaktnosť, vysoká rýchlosť serializácie/deserializácie.
    • Nevýhody: Čítanie dát je sťažené bez schémy, môžu nastať problémy s kompatibilitou medzi rôznymi architektúrami (napr. endianness).
    • Príklady: Protocol Buffers, Apache Thrift, Cap'n Proto, MessagePack.

Okrem toho, serializáciu možno klasifikovať podľa spôsobu použitia:

  • Ručná: Vývojár explicitne píše kód na prevod dát objektu na bajty a späť.

    • Príklad:
    // Príklad ručnej serializácie int
    int data = 12345;
    std::vector<char> buffer;
    buffer.resize(sizeof(int));
    std::memcpy(buffer.data(), &data, sizeof(int));
    
  • Automatická (reflexia/kód generovanie): Používajú sa knižnice alebo nástroje, ktoré automaticky vykonávajú serializáciu/deserializáciu na základe informácií o štruktúre údajov.

    • Príklad: Použitie knižníc ako Boost.Serialization, cereal, RapidJSON (s vlastnými adaptérmi), alebo nástrojov na generovanie kódu pre Protocol Buffers.
    // Príklad použitia 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;
    }
    

Dôležité je tiež zvážiť:

  • Schémová vs bezšémová: Vyžaduje sa explicitné určenie štruktúry údajov (schéma) alebo je formát údajov samoopisujúci.
  • Prúdová vs bufferovaná: Môže sa serializácia vykonávať počas prijímania údajov alebo je potrebný celý objem údajov v pamäti pred serializáciou/deserializáciou.