BOOST serialization mit 'load_construct_data'
-
Hallo

Ich habe eine Klasse mit konstanten, nur durch den Konstruktor gesetzten, Variablen.
Bei der De-/Serialisierung mit Boost wird normalerweise ein leeres Objekt erzeugt und dann die privaten Member der Klasse einzeln zugewiesen. Bei Objekten ohne Standardkonstruktor soll man 'load_construct_data' benutzen.
Das habe ich versucht, klappt aber nicht wie gewünscht, ich weiß nicht, wohin ich die Funktion schreiben soll, damit sie überschrieben und dann auch aufgerufen wird.Ein vollständiges Beispiel ist unter http://nopaste.info/a4294df9fd.html zu finden (darunter die entsprechende Fehlermeldung) bzw hier:
#pragma warning(push, 0) #include <boost/serialization/base_object.hpp> #include <boost/serialization/list.hpp> #include <boost/serialization/map.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/shared_ptr.hpp> #include <boost/shared_ptr.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> #include <boost/serialization/nvp.hpp> #pragma warning(pop) #include <fstream> #include <iostream> #include <string> class Object { public: Object(const unsigned int id, const std::string& name); ~Object() {} private: friend class boost::serialization::access; template<class Archive> void serialize(Archive &ar, const unsigned int version) { ar & boost::serialization::make_nvp("id", id); ar & boost::serialization::make_nvp("name", name); if(version > 0) { } } const unsigned int id; const std::string name; Object& operator=(const Object& other); }; namespace boost { namespace serialization { template<class Archive> void load_construct_data(Archive& ar, Object* t, const unsigned int version) { unsigned int loaded_id; std::string loaded_name; ar & boost::serialization::make_nvp("id", loaded_id); ar & boost::serialization::make_nvp("name", loaded_name); ::new(t)Object(loaded_id, loaded_name); if(version > 0) { } } }} Object::Object( const unsigned int id, const std::string& name): id(id), name(name) { } void saveToXML(const Object& tis , const std::string& filename, const std::string& name) { std::ofstream ofs(filename.c_str()); boost::archive::xml_oarchive oa(ofs); oa << boost::serialization::make_nvp(name.c_str(), tis); ofs.close(); } void loadFromXML(Object* tis, const std::string& filename, const std::string& name) { std::ifstream ifs(filename.c_str()); boost::archive::xml_iarchive ia(ifs); ia >> boost::serialization::make_nvp(name.c_str(), tis); ifs.close(); } int main() { // remove previously written files std::remove("test.txt"); Object object(1, "testobject"); // save the object saveToXML(object, "test.txt", "testname"); // reload the map Object* new_object2 = NULL; loadFromXML(new_object2, "test.txt", "testname"); std::remove("test.txt"); } /* 1>------ Erstellen gestartet: Projekt: test, Konfiguration: Release Win32 ------ 1> test.cpp 1>C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/check.hpp(162): error C2338: typex::value 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(577): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::detail::check_const_loading<T>(void)". 1> with 1> [ 1> T=const unsigned int 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/common_iarchive.hpp(66): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::load<Archive,T>(Archive &,T &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const unsigned int 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/basic_xml_iarchive.hpp(86): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::detail::common_iarchive<Archive>::load_override<T>(T &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const unsigned int 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/xml_iarchive.hpp(93): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::basic_xml_iarchive<Archive>::load_override<const unsigned int>(const boost::serialization::nvp<T> &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const unsigned int 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/interface_iarchive.hpp(60): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::xml_iarchive_impl<Archive>::load_override<T>(T &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const boost::serialization::nvp<const unsigned int> 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/interface_iarchive.hpp(67): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "Archive &boost::archive::detail::interface_iarchive<Archive>::operator >><T>(T &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const boost::serialization::nvp<const unsigned int> 1> ] 1> test.cpp(30): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "Archive &boost::archive::detail::interface_iarchive<Archive>::operator &<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const unsigned int 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/serialization/access.hpp(118): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void Object::serialize<Archive>(Archive &,const unsigned int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/serialization/serialization.hpp(69): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::serialization::access::serialize<Archive,T>(Archive &,T &,const unsigned int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/serialization/serialization.hpp(128): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::serialization::serialize<Archive,T>(Archive &,T &,const unsigned int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(192): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::serialization::serialize_adl<Archive,T>(Archive &,T &,const unsigned int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(170): Bei der Kompilierung der Klassen-template der void boost::archive::detail::iserializer<Archive,T>::load_object_data(boost::archive::detail::basic_iarchive &,void *,const unsigned int) const-Memberfunktion 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(208): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::archive::detail::iserializer<Archive,T>". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(205): Bei der Kompilierung der Klassen-template der const boost::archive::detail::basic_iserializer &boost::archive::detail::pointer_iserializer<Archive,T>::get_basic_serializer(void) const-Memberfunktion 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/interface_iarchive.hpp(54): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::archive::detail::pointer_iserializer<Archive,T>". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(459): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "const boost::archive::detail::basic_pointer_iserializer *boost::archive::detail::interface_iarchive<Archive>::register_type<T>(T *)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(475): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "const boost::archive::detail::basic_pointer_iserializer *boost::archive::detail::load_pointer_type<Archive>::non_abstract::register_type<T>(Archive &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(515): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "const boost::archive::detail::basic_pointer_iserializer *boost::archive::detail::load_pointer_type<Archive>::register_type<Object>(Archive &,const T &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(592): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::detail::load_pointer_type<Archive>::invoke<T>(Archive &,Tptr &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object *, 1> Tptr=Object * 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/common_iarchive.hpp(66): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::load<Archive,T>(Archive &,T &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object * 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/basic_xml_iarchive.hpp(86): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::detail::common_iarchive<Archive>::load_override<T>(T &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object * 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/xml_iarchive.hpp(93): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::basic_xml_iarchive<Archive>::load_override<Object*>(const boost::serialization::nvp<T> &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object * 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/interface_iarchive.hpp(60): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::xml_iarchive_impl<Archive>::load_override<T>(T &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const boost::serialization::nvp<Object *> 1> ] 1> test.cpp(86): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "Archive &boost::archive::detail::interface_iarchive<Archive>::operator >><const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=Object * 1> ] 1>C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/check.hpp(162): error C2338: typex::value 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/iserializer.hpp(577): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::detail::check_const_loading<T>(void)". 1> with 1> [ 1> T=const std::string 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/common_iarchive.hpp(66): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::load<Archive,T>(Archive &,T &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const std::string 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/basic_xml_iarchive.hpp(86): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::detail::common_iarchive<Archive>::load_override<T>(T &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const std::string 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/xml_iarchive.hpp(93): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::basic_xml_iarchive<Archive>::load_override<const std::string>(const boost::serialization::nvp<T> &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const std::string 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/interface_iarchive.hpp(60): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::archive::xml_iarchive_impl<Archive>::load_override<T>(T &,int)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const boost::serialization::nvp<const std::string> 1> ] 1> C:UsersClawgDocumentsVisual Studio 2010Projectsboost_1_45_0boost/archive/detail/interface_iarchive.hpp(67): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "Archive &boost::archive::detail::interface_iarchive<Archive>::operator >><T>(T &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const boost::serialization::nvp<const std::string> 1> ] 1> test.cpp(31): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "Archive &boost::archive::detail::interface_iarchive<Archive>::operator &<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)". 1> with 1> [ 1> Archive=boost::archive::xml_iarchive, 1> T=const std::string 1> ] ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ========== */Jemand eine Idee?
Vielen Dank im voraus
