boost::serialize und speichern einer Datei im Binärformat



  • Hallo allerseits,

    ich möchte eine Datei erzeugen die ein struct wie im Beispiel angegeben enthält. Mein Ziel dabei ist, die Dateigröße gering zu halten.

    Wenn ich nun das Prog. laufen lasse, erzeugt es eine Datei namens filename mit einer Größe von ~26K was mir viel zu groß erscheint. Ein Blick in die Datei zeigt den Ausschnitt

    ^@^D^H^D^H^A^@^@^@^@^@^@^@^@^G^@^@^@^@^@^@^@some id^@^@^@^@^@d^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@0000000000000000000‌​000000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000000000000000000000000000000000000000000000000000‌​000000000000000000000000000000000000000000000000000000000000000000000000000^@^A^@‌​^@^@^@^@^@0

    Mir erscheint das nicht als binäres Speicherformat. Vlt. liege ich falsch aber die Größe sollte bei ~256*100 bits + String + overhead sein, was etwa 3.1kb ergibt.

    Gibt es einen Weg das Problem mit boost::serialize zu lösen?

    Danke sehr

    #include <vector>
    #include <string>
    #include <bitset>
    #include <fstream>
    #include <boost/serialization/string.hpp>
    #include <boost/serialization/vector.hpp>
    #include <boost/serialization/bitset.hpp>
    #include <boost/archive/binary_oarchive.hpp>
    
    template<size_t N>
    struct Example
    {
      std::string id;
      std::vector<std::bitset<N>> bits;
    };
    
    template<size_t N>
    Example<N> make_example()
    {
      Example<N> example;
    
      example.id = "some id";
    
      example.bits.resize(100);
    
      return example;
    }
    namespace boost
    {
      namespace serialization
      {
        template<typename Archive, size_t N>
        void serialize ( Archive & a
                       , Example<N> & e
                       , const unsigned int version )
        {
            a & e.id;
            a & e.bits;
        }
      }
    }
    
    int main()
    {
      auto example = make_example<256>();
    
      std::ofstream ofs("filename", std::ios::binary);
    
      boost::archive::binary_oarchive oa(ofs);
    
      oa << example;
    
      return 0;
    }
    

Anmelden zum Antworten