boost::serialization Fehler, static assertion beschwert sich über konstante Objekte



  • Hi!

    Ich arbeite momentan an einem neuen Projekt, und brauche für eine Klasse eine Serialisierung. Diese führe ich mit der entsprechenden Boost-Bibliothek durch; allerdings gibt es einen Fehler, den ich mir so nicht erklären kann:

    for(auto &pair : mPositions)
    {
           ar & pair.first; //Hier
           //...
    }
    

    mPositions ist folgendermaßen deklariert:

    std::unordered_multimap<std::string, Ogre::Vector3> mPositions;
    

    ar ist hierbei das I/O-Archiv.

    Wenn ich die Zeile auskommentiere, kompiliert es (aber natürlich muss ich den String mit serialisieren). Die gesamte Fehlermeldung sieht so aus:

    Codeblocks Log (GCC) schrieb:

    C:\C++LIBRARIES\Boost\boost\archive\detail\iserializer.hpp:577|5|instantiated from 'void boost::archive::load(Archive&, T&) [with Archive = boost::archive::text_iarchive, T = const std::basic_string<char>]'|
    C:\C++LIBRARIES\Boost\boost\archive\detail\common_iarchive.hpp:66|9|instantiated from 'void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = const std::basic_string<char>, Archive = boost::archive::text_iarchive]'|
    C:\C++LIBRARIES\Boost\boost\archive\basic_text_iarchive.hpp:65|9|instantiated from 'void boost::archive::basic_text_iarchive<Archive>::load_override(T&, int) [with T = const std::basic_string<char>, Archive = boost::archive::text_iarchive]'|
    C:\C++LIBRARIES\Boost\boost\archive\text_iarchive.hpp:82|9|instantiated from 'void boost::archive::text_iarchive_impl<Archive>::load_override(T&, int) [with T = const std::basic_string<char>, Archive = boost::archive::text_iarchive]'|
    C:\C++LIBRARIES\Boost\boost\archive\detail\interface_iarchive.hpp:60|9|instantiated from 'Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const std::basic_string<char>, Archive = boost::archive::text_iarchive]'|
    C:\C++LIBRARIES\Boost\boost\archive\detail\interface_iarchive.hpp:67|35|instantiated from 'Archive& boost::archive::detail::interface_iarchive<Archive>::operator&(T&) [with T = const std::basic_string<char>, Archive = boost::archive::text_iarchive]'|
    C:\Users\Documents\C(++) Saves\Ogre\CheckBounce\Level.hxx:37|25|instantiated from 'void Level::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]'|
    C:\C++LIBRARIES\Boost\boost\serialization\access.hpp:118|9|instantiated from 'static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = Level]'|
    C:\C++LIBRARIES\Boost\boost\serialization\serialization.hpp:69|5|instantiated from 'void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = Level]'|
    C:\C++LIBRARIES\Boost\boost\serialization\serialization.hpp:128|9|instantiated from 'void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = Level]'|
    C:\C++LIBRARIES\Boost\boost\archive\detail\iserializer.hpp:188|5|instantiated from 'void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::text_iarchive, T = Level]'|
    C:\Users\Documents\C(++) Saves\Ogre\CheckBounce\Level.cxx:25|1|instantiated from here|
    C:\C++LIBRARIES\Boost\boost\archive\detail\check.hpp|162|error: static assertion failed: "typex::value"|

    Zeile 37 ist die oben Markierte Zeile ( //Hier ).
    Die Stelle mit der fehlschlagenden assertion sieht so aus:

    // cannot load data into a "const" object unless it's a
        // wrapper around some other non-const object.
        BOOST_STATIC_ASSERT(typex::value); Assertion
    

    Der Comment darüber stellt also offensichtlich den Fehler dar (den ich wunderbar nachvollziehen kann). Aber was genau ist hier denn const ?

    Danke im Voraus,

    MfG



  • Der value_type einer map (sowie auch unordered_map) lautet pair<const key_type,mapped_type>, damit der Key eines Elements in einer Map nicht geändert werden kann. Siehe STL-Referenz.



  • ananas schrieb:

    Der value_type einer map (sowie auch unordered_map) lautet pair<const key_type,mapped_type>, damit der Key eines Elements in einer Map nicht geändert werden kann. Siehe STL-Referenz.

    Ouh, also ein Design Fehler. Danke.
    Jetzt wo es mir auffällt...wie kann man eigentlich Arrays serialisieren?



  • Lies mal die Doku, man. Da steht sowohl was zu Arrays drin, als auch dazu, wie man STL-Collections serialisiert. Unter anderem wirst Du dann sehen, dass es <boost/serialization/map.hpp> gibt, mit dem man auch Multimaps bearbeiten kann.



  • Tachyon schrieb:

    Lies mal die Doku, man. Da steht sowohl was zu Arrays drin, als auch dazu, wie man STL-Collections serialisiert. Unter anderem wirst Du dann sehen, dass es <boost/serialization/map.hpp> gibt, mit dem man auch Multimaps bearbeiten kann.

    Hab ich nicht zu Ende gelesen, stimmt... Danke 😃



  • Es geht jetzt, nur musste ich einen Wrapper um eine Klasse ( Ogre::Vector3 ) schreiben, die natürlich keine entsprechende serialize -Methode hat. Geht das auch anders? Oder soll ich das gleich in die Klassendefinition reinschreiben?

    (Das Tutorial sagt nix).



  • RTFM.
    Du willst nonintrusive und vermutlich auch splitting into load/save...

    Wozu brauchst Du das überhaupt? Ogre kann doch selbst serialisieren und deserialiseren?!



  • Tachyon schrieb:

    RTFM.
    Du willst nonintrusive

    Danke, ja das wollt' ich 😃

    Tachyon schrieb:

    Wozu brauchst Du das überhaupt? Ogre kann doch selbst serialisieren und deserialiseren?!

    Mir geht es darum, dass ich ein Level "serialisieren" kann; Es sollen also die Namen von Meshes (es ist festgelegt, welche Namen für welche Meshes stehen und welche Meshes das sind) und deren Position/Rotation Gespeichert werden.

    Das Ogre überhaupt Serialisierung unterstützt, wusste ich nicht (ich kenne nur Mesh&Material -serializer, die für mich nicht wichtig sind). So (mit meiner Serialisierung) ist es aber für mich einfacher, weil nur eine Begrenzte Menge an Daten gebraucht wird( z. B. nicht Skalierung), somit würde dann wahrscheinlich Redundanz auftreten... das ist meine Überlegung


Anmelden zum Antworten