Serialization problem with polymorphic archives and std::string
Hi there, I'm trying to convert a piece of code from templated archives to polymorphic ones, and am running into trouble when serializing std::string. Either I get an error message saying that std::string has no serialize member function, or I get the attached message. The relevant code is this: ---snip--- #include <boost/serialization/serialization.hpp> #include <boost/archive/polymorphic_iarchive.hpp> #include <boost/archive/polymorphic_oarchive.hpp> void mtime::serialize(boost::archive::polymorphic_iarchive& ar, const unsigned int file_version) { std::string iso; ar & boost::serialization::make_nvp("iso_time", iso); set_from_iso_string(iso); } void mtime::serialize(boost::archive::polymorphic_oarchive& ar, const unsigned int file_version) { std::string iso =3D to_iso_string(); ar & boost::serialization::make_nvp("iso_time", iso); } ---snip--- Am I missing something obvious? Are certain types not directly supported for serialization via polymorphic archives? Any help would be much appreciated. -- Cheers =8-} Mike Friede, Völkerverständigung und überhaupt blabla --=-=-= g++ -g -Wall -I /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1 -c -o mtime.o mtime.cpp /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/iserializer.hpp: In constructor `boost::archive::detail::iserializer<Archive, T>::iserializer() [with Archive = boost::archive::polymorphic_iarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]': /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/iserializer.hpp:146: instantiated from `static boost::archive::detail::iserializer<Archive, T>& boost::archive::detail::iserializer<Archive, T>::instantiate() [with Archive = boost::archive::polymorphic_iarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/iserializer.hpp:375: instantiated from `static void boost::archive::detail::load_non_pointer_type<Archive, T>::load_standard::invoke(Archive&, T&) [with Archive = boost::archive::polymorphic_iarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/iserializer.hpp:425: instantiated from `static void boost::archive::detail::load_non_pointer_type<Archive, T>::invoke(Archive&, T&) [with Archive = boost::archive::polymorphic_iarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/iserializer.hpp:572: instantiated from `void boost::archive::load(Archive&, T&) [with Archive = boost::archive::polymorphic_iarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/polymorphic_iarchive.hpp:127: instantiated from `void boost::archive::polymorphic_iarchive::load_override(const boost::serialization::nvp<T>&, int) [with T = std::string]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/interface_iarchive.hpp:76: instantiated from `Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<std::string>, Archive = boost::archive::polymorphic_iarchive]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/interface_iarchive.hpp:83: instantiated from `Archive& boost::archive::detail::interface_iarchive<Archive>::operator&(T&) [with T = const boost::serialization::nvp<std::string>, Archive = boost::archive::polymorphic_iarchive]' mtime.cpp:36: instantiated from here /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/iserializer.hpp:115: error: incomplete type `boost::serialization::extended_type_info_null<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >' used in nested name specifier /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/oserializer.hpp: In constructor `boost::archive::detail::oserializer<Archive, T>::oserializer() [with Archive = boost::archive::polymorphic_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]': /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/oserializer.hpp:135: instantiated from `static boost::archive::detail::oserializer<Archive, T>& boost::archive::detail::oserializer<Archive, T>::instantiate() [with Archive = boost::archive::polymorphic_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/oserializer.hpp:264: instantiated from `static void boost::archive::detail::save_non_pointer_type<Archive, T>::save_standard::invoke(Archive&, const T&) [with Archive = boost::archive::polymorphic_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/oserializer.hpp:322: instantiated from `static void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::archive::polymorphic_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/oserializer.hpp:536: instantiated from `void boost::archive::save(Archive&, const T&) [with Archive = boost::archive::polymorphic_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/polymorphic_oarchive.hpp:128: instantiated from `void boost::archive::polymorphic_oarchive::save_override(const boost::serialization::nvp<T>&, int) [with T = std::string]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/interface_oarchive.hpp:78: instantiated from `Archive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const boost::serialization::nvp<std::string>, Archive = boost::archive::polymorphic_oarchive]' /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/interface_oarchive.hpp:86: instantiated from `Archive& boost::archive::detail::interface_oarchive<Archive>::operator&(T&) [with T = const boost::serialization::nvp<std::string>, Archive = boost::archive::polymorphic_oarchive]' mtime.cpp:46: instantiated from here /afs/informatik.uni-tuebingen.de/i386_fbsd54/boost-1.33.1/include/boost-1_33_1/boost/archive/detail/oserializer.hpp:108: error: incomplete type `boost::serialization::extended_type_info_null<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >' used in nested name specifier make: *** [mtime.o] Error 1 Compilation exited abnormally with code 2 at Wed Feb 22 11:56:36 --=-=-=--
Have you included #include <boost/serialization/string.hpp> ? Michael Sperber wrote:
Hi there,
I'm trying to convert a piece of code from templated archives to polymorphic ones, and am running into trouble when serializing std::string. Either I get an error message saying that std::string has no serialize member function, or I get the attached message.
The relevant code is this:
---snip--- #include <boost/serialization/serialization.hpp>
#include <boost/archive/polymorphic_iarchive.hpp> #include <boost/archive/polymorphic_oarchive.hpp>
void mtime::serialize(boost::archive::polymorphic_iarchive& ar, const unsigned int file_version) { std::string iso; ar & boost::serialization::make_nvp("iso_time", iso); set_from_iso_string(iso); }
void mtime::serialize(boost::archive::polymorphic_oarchive& ar, const unsigned int file_version) { std::string iso =3D to_iso_string(); ar & boost::serialization::make_nvp("iso_time", iso); } ---snip---
Am I missing something obvious? Are certain types not directly supported for serialization via polymorphic archives? Any help would be much appreciated.
"Robert Ramey" <ramey@rrsd.com> writes:
Have you included
#include <boost/serialization/string.hpp>
?
Erh, no. Thanks, much better now! -- Cheers =8-} Mike Friede, Völkerverständigung und überhaupt blabla
boost::serialization considers std::string a primative type. This means it causes problems sometimes when polymorphim or pointers are used. The solution is to make a wrapper around the string, something like: class tracked_string { public: tracked_string() {} tracked_string(const std::string& src) { m_string = src; } tracked_string(const tracked_string& src) : m_string(src) {} template<class Archive> void serialize(Archive &ar, unsigned int version) { ar & m_string; } // casting operators operator std::string() const { return m_string; } operator std::string() { return m_string; } private: std::string m_string; // the real data }; Michael Sperber wrote:
Hi there,
I'm trying to convert a piece of code from templated archives to polymorphic ones, and am running into trouble when serializing std::string. Either I get an error message saying that std::string has no serialize member function, or I get the attached message.
The relevant code is this:
---snip--- #include <boost/serialization/serialization.hpp>
#include <boost/archive/polymorphic_iarchive.hpp> #include <boost/archive/polymorphic_oarchive.hpp>
void mtime::serialize(boost::archive::polymorphic_iarchive& ar, const unsigned int file_version) { std::string iso; ar & boost::serialization::make_nvp("iso_time", iso); set_from_iso_string(iso); }
void mtime::serialize(boost::archive::polymorphic_oarchive& ar, const unsigned int file_version) { std::string iso =3D to_iso_string(); ar & boost::serialization::make_nvp("iso_time", iso); } ---snip---
Am I missing something obvious? Are certain types not directly supported for serialization via polymorphic archives? Any help would be much appreciated.
participants (4)
-
Jeffrey Holle
-
Michael Sperber
-
Michael Sperber
-
Robert Ramey