Sobes.tech
Junior

Na jaké druhy lze rozdělit serializaci?

sobes.tech AI

Odpověď od AI

Serializace lze rozdělit do následujících základních typů podle způsobu zobrazení dat:

  • Textová: Data jsou zobrazena ve čitelném formátu, nejčastěji ve formě řetězců.

    • Výhody: Snadné ladění, nezávislost na architektuře.
    • Nevýhody: Větší objem dat, nutnost parsování.
    • Příklady: JSON, XML, YAML.
  • Binární: Data jsou zobrazena v surovém, binárním formátu.

    • Výhody: Kompaktnost, vysoká rychlost serializace/deserializace.
    • Nevýhody: Čtení dat je složité bez schématu, mohou nastat problémy s kompatibilitou mezi různými architekturami (například endianness).
    • Příklady: Protocol Buffers, Apache Thrift, Cap'n Proto, MessagePack.

Kromě toho lze serializaci klasifikovat podle způsobu použití:

  • Ruční: Vývojář explicitně píše kód pro převod dat objektu na bajty a zpět.

    • Příklad:
    // Příklad ruční serializace int
    int data = 12345;
    std::vector<char> buffer;
    buffer.resize(sizeof(int));
    std::memcpy(buffer.data(), &data, sizeof(int));
    
  • Automatická (reflexe/kódová generace): Používají se knihovny nebo nástroje, které automaticky provádějí serializaci/deserializaci na základě informací o struktuře dat.

    • Příklad: Použití knihoven jako Boost.Serialization, cereal, RapidJSON (s uživatelskými adaptéry), nebo nástrojů pro generování kódu pro Protocol Buffers.
    // Příklad použití 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;
    }
    

Je také důležité vzít v úvahu:

  • Schéma vs bez schématu: Vyžaduje se explicitní definice struktury dat (schéma), nebo je formát dat samo popisující?
  • Streamový vs bufferovaný: Může serializace probíhat při přijímání dat, nebo je nutné načíst celý objem dat do paměti před serializací/deserializací.