Boost Serialisierung: shared_ptr
-
Hi allerseits
Momentan versuche ich einige meiner Klassen über shared_ptr und Boost Serialization zu serialisieren. Unglücklicherweise erhalte ich beim Deserialisieren folgenden Laufzeitfehler:
../basic_iarchive.cpp:390: const boost::archive::detail::basic_pointer_iserializer* boost::archive::detail::basic_iarchive_impl::load_pointer(boost::archive::detail::basic_iarchive&, void*&, const boost::archive::detail::basic_pointer_iserializer*, const boost::archive::detail::basic_pointer_iserializer*(*)(const boost::serialization::extended_type_info&)): Assertion `new_cid == cid' failed. AbortedBei genauerem Hinsehen ist mir aufgefallen, dass ich vergessen habe, <boost/serialization/shared_ptr.hpp> zu inkludieren und war daher auch überrascht, dass das Programm trotzdem problemlos kompilierte. Weniger überraschend war dann, dass auch das anschliessende Inkludieren keine Verbesserung brachte. Besonders der Programmgrösse nach zu urteilen, welche exakt dieselbe blieb, werden die Funktionen in diesem Header scheinbar trotzdem überhaupt nicht verwendet.
Meine erste Sorge ist also: Ist das die korrekte Art, einen shared_ptr zu serialisieren:
typedef boost::shared_ptr<ProtocolFactory> ProtocolFactoryPtr; // ... vector<ProtocolFactoryPtr> factories = list_of(ProtocolFactoryPtr(new Iec1107OverSerialFactory())); ProtocolFactoryPtr iec1107(new MeteringProtocolCompositeFactory(factories)); ofstream ofs("testIt.xml"); archive::xml_oarchive oxml(ofs); oxml << serialization::make_nvp("supportedProtocols", iec1107); // ... ProtocolFactoryPtr newProtocolFactory; ifstream ifs("testIt.xml"); archive::xml_iarchive ixml(ifs); ixml >> serialization::make_nvp("supportedProtocols", newProtocolFactory);Dabei ist zu beachten, dass ProtocolFactory eine abstrakte Basisklasse von Iec1107OverSerialFactory und MeteringProtocolCompositeFactory ist, wobei MeteringProtocolCompositeFactory selbst einen shared_ptr-Vektor (vector<ProtocolFactoryPtr>) enthält. Die drei relevanten Klassen werden wie folgt serialisiert:
ProtocolFactory:
template<class archive> void serialize(archive &, const unsigned int) { }Iec1107OverSerialFactory:
#include <boost/serialization/base_object.hpp> #include <boost/serialization/export.hpp> #include <boost/serialization/nvp.hpp> BOOST_CLASS_EXPORT(Iec1107OverSerialFactory) // Boost must include Serialization info for this class even if its not directly referencd (e.g. by its base class) template<class Archive> void Iec1107OverSerialFactory::serialize(Archive &ar, const unsigned int version) { using boost::serialization::make_nvp; ar & make_nvp("ProtocolFactory", boost::serialization::base_object<ProtocolFactory>(*this)); }MeteringProtocolCompositeFactory:
#include <boost/serialization/base_object.hpp> #include <boost/serialization/export.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/nvp.hpp> BOOST_CLASS_EXPORT(MeteringProtocolCompositeFactory) // Boost must include Serialization info for this class even if its not directly referencd (e.g. by its base class) namespace boost { namespace serialization { template<class Archive> inline void save_construct_data(Archive &ar, const MeteringProtocolCompositeFactory *pf, const unsigned int version) { using boost::serialization::make_nvp; ar & make_nvp("IncludedProtocols", pf->getFactories()); } template<class Archive> inline void load_construct_data(Archive &ar, MeteringProtocolCompositeFactory *pf, const unsigned int version) { using boost::serialization::make_nvp; std::vector<ProtocolFactoryPtr> factories; ar & make_nvp("IncludedProtocols", factories); ::new(pf)MeteringProtocolCompositeFactory(factories); } } } template<class Archive> void MeteringProtocolCompositeFactory::serialize(Archive &ar, const unsigned int version) { using boost::serialization::make_nvp; ar & make_nvp("ProtocolFactory", boost::serialization::base_object<ProtocolFactory>(*this)); }Zweitens frage ich mich auch, weshalb <boost/serialization/shared_ptr.hpp> scheinbar gar nicht benötigt / verwendet wird beim Ausführen von "oxml << serialization::make_nvp("supportedProtocols", iec1107);" oder "ixml >> serialization::make_nvp("supportedProtocols", newProtocolFactory);" ...?
Besten Dank in jedem Fall für eure Antworten und greeetz
Kessi
-
boost/serialization/shared_ptr.hpp wird wahrscheinlich indirekt über einen anderen import includiert
-
???
Google spuckt ca. 306 Ergebnisse zu:
boost assertion `new_cid == cid' failed
aus...