boost.serialization



  • Ich verwende die boost lib um damit Daten zu Serialisieren und als XML abzuspeichern. Das abspeichern klappt wunderbar. Nun will ich einen Archiv-Betrachter programmieren der das ganze wieder lädt, aber da gibt es Probleme.

    Ich habe eine eigene Klasse Daten.hpp erstellt, von welcher alle Art von Daten die serialisiert werden sollen abgeleitet sind. Als erstes seien hier die Archivdaten selbst genannt. Hier und hier zu finden.

    Ich erstelle hier zum Laden einen Zeiger

    ArchivDaten* A;
    

    und will ihn dann füllen

    Archivdatei >> boost::serialization::make_nvp("ArchivDaten", A);
    

    .

    Dabei gibt es aber leider Probleme die mir absolut gar nichts sagen:

    fabske@neptun:/$ g++ -lboost_serialization -lboost_system ArchivBetrachter.cpp 
    /tmp/cchA0ToF.o: In function `boost::serialization::extended_type_info_typeid<ArchivDaten>::extended_type_info_typeid()':
    ArchivBetrachter.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI11ArchivDatenEC2Ev[_ZN5boost13serialization25extended_type_info_typeidI11ArchivDatenEC5Ev]+0x3b): undefined reference to `typeinfo for ArchivDaten'
    /tmp/cchA0ToF.o: In function `void boost::serialization::access::construct<ArchivDaten>(ArchivDaten*)':
    ArchivBetrachter.cpp:(.text._ZN5boost13serialization6access9constructI11ArchivDatenEEvPT_[void boost::serialization::access::construct<ArchivDaten>(ArchivDaten*)]+0x2a): undefined reference to `ArchivDaten::ArchivDaten()'
    /tmp/cchA0ToF.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'
    /tmp/cchA0ToF.o: In function `ArchivDaten const* boost::serialization::smart_cast_impl::pointer<ArchivDaten const*>::polymorphic::cast<Daten const>(Daten const*)':
    ArchivBetrachter.cpp:(.text._ZN5boost13serialization15smart_cast_impl7pointerIPK11ArchivDatenE11polymorphic4castIK5DatenEES5_PT_[ArchivDaten const* boost::serialization::smart_cast_impl::pointer<ArchivDaten const*>::polymorphic::cast<Daten const>(Daten const*)]+0x21): undefined reference to `typeinfo for ArchivDaten'
    ArchivBetrachter.cpp:(.text._ZN5boost13serialization15smart_cast_impl7pointerIPK11ArchivDatenE11polymorphic4castIK5DatenEES5_PT_[ArchivDaten const* boost::serialization::smart_cast_impl::pointer<ArchivDaten const*>::polymorphic::cast<Daten const>(Daten const*)]+0x29): undefined reference to `typeinfo for Daten'
    collect2: ld returned 1 exit status
    


  • Du bist definitiv im falschen Forum gelandet. Kann ein Mod bitte verschieben? Danke 🙂

    Zum Thema: Hast du den typeinfo Header includiert?



  • Ich hab nur das inkludiert was da steht. 🙂

    Wozu brauche ich denn den Typeinfo header und wie sieht der aus?



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Guck mal hier: http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/tutorial.html#simplecase

    Meiner Meinug nach musst Du folgendes tun:
    1. Stream erstellen / öffnen der die Daten bereitstellt
    2. Archiv erstellen und den Stream übergeben
    3. Leeres Daten Objekt (kein Pointer!) erstellen und danach archive >> daten; aufrufen

    Simon



  • 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. 🙂


Log in to reply