boost.serialization



  • Es tut mir Leid, ich war mal wieder etwas zu voreilig, denn ich vergaß wichtige Dateien mitzuübersetzen! Hab das nun korrigiert und meine Code etwas zurückgefahren.

    Ich möchte nun ERSTMAL nur die Daten.hpp serialisieren, also die Basisklasse, bevor ich dann mit einer abgeleiteten anfange. Leider klappt das auch noch net so ganz..

    Daten* D;
      Archivdatei >> boost::serialization::make_nvp("Daten", D);
    

    An dieser Stelle sagt er mir dann:

    /home/fabske/ArchivBetrachter.o: In function `boost::serialization::extended_type_info_typeid<Daten>::extended_type_info_typeid()':
    ArchivBetrachter.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI5DatenEC2Ev[_ZN5boost13serialization25extended_type_info_typeidI5DatenEC5Ev]+0x3b): undefined reference to `typeinfo for Daten'
    /home/fabske/ArchivBetrachter.o: In function `void boost::serialization::access::construct<Daten>(Daten*)':
    ArchivBetrachter.cpp:(.text._ZN5boost13serialization6access9constructI5DatenEEvPT_[void boost::serialization::access::construct<Daten>(Daten*)]+0x2a): undefined reference to `Daten::Daten()'
    collect2: ld returned 1 exit status
    

    Die Daten.hpp hab ich aber natürlich inkludiert!



  • Meine Vermutungen:

    • Du hast vergessen in ArchivBetrachter.cpp die Daten.hpp zu inkludieren.
    • Du hast keinen Standardkonstruktor für die Klasse Daten


  • Deine Vermutungen lassen sich durch die nopastes in meinem ersten Post widerlegen!



  • fabske schrieb:

    Deine Vermutungen lassen sich durch die nopastes in meinem ersten Post widerlegen!

    Du zeigst uns nur die Klassendefinition. Wo ist die Implementierung?

    Hast du vielleicht vergessen die Klasse zu registrieren?



  • Also hier ist mal die Klassendefinition: http://nopaste.info/5d9f2a089a.html

    Was meinst du mit "registrieren"? Ich gebe die Datei einfach beim Übersetzen mit an!



  • fabske schrieb:

    Was meinst du mit "registrieren"? Ich gebe die Datei einfach beim Übersetzen mit an!

    Ich habe lange nicht mehr mit boost::serialization gearbeitet. Aber von dem was ich noch weiss, muss man dem boost::archive::* mitteilen, dass er die Klasse registrieren soll damit er die Klasse überhaupt kennt.

    Edit: register_type ist das Stichwort!



  • Guck dir einfach das Tutorial auf der Boost Seite an, das sagt alles was nötig ist!



  • In der Tat hatte ich ein paar Standardkonstruktoren vergessen und hatte auch noch ein Problem mit scons!

    Das alles konnte ich selbstständig lösen und kann bereits Daten serialisieren und deserialisieren! 🙂 Vielen Dank für die Hilfe!

    Jetzt geht es an die Module. Auch diese kann ich schon serialisieren, aber beim deserialisieren gibt es Probleme. Wieder ganz einfach:

    //Wir öffnen die übergeben Archivdatei
      boost::filesystem::ifstream datei(dateiname.str()); 
      boost::archive::xml_iarchive Archivdatei(datei); 
      Archivdatei.register_type<Modul>();
      Archivdatei.register_type<BeispielModul1>();
      Archivdatei.register_type<BeispielModul2>();
      Archivdatei.register_type<BeispielModul3>();
    
      ArchivDaten* AD;
      Archivdatei >> boost::serialization::make_nvp("ArchivDaten", AD);
    

    Die BeispielModule erben von Modul und in der ArchivDaten sind einfach Pointer drin: http://nopaste.info/01dd37ef12.html
    Eigentlich alles ganz einfach und serialisiert wird auch wunderbar, die XML Datei sieht toll aus!
    Aber beim übersetzen der Deserialisierung krieg ich eine riesige Fehlermeldung: http://nopaste.info/fcdd63dff4.html



  • Hast Du const-Member in den Klassen, welche Du da deserialisieren willst?



  • Ja hab ich! Ist das ein Problem?



  • Es lag tatsächlich an den const Variablen UND an einer pure virtual Funktion! Beides lässt sich nicht de/serialisieren.

    Ich hab diese Teile dann mit Preprozessoranweisungen für die Deserialisierung ausgenommen. 🙂


Anmelden zum Antworten