
"Jan Eickmann" <je@framesys.de> wrote in message news:d58nee$rdh$1@sea.gmane.org...
Hello,
...
I'm trying to serialize a list of shared_ptr's to objects.
Here's a summary of the code I have:
namespace MyNamespace {
class B { //implementation plus standard serialization function };
class A { private: list< shared_ptr<B> > myBs; public: template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(myBs); } };
}
If I just try to serialize it, I get an unregistered_class exception. So I think I have to use BOOST_SHARED_POINTER_EXPORT(_GUID) to register the shared_ptr.
When I include this inside the namespace (please note that the error messages are from my real code, so they have slightly other names:
BOOST_SHARED_POINTER_EXPORT(B)
I get this: f:\xenocide\xenocide\src\common\simulation\simulation.h(108) : error C2059: syntax error : 'string' f:\xenocide\xenocide\src\common\simulation\simulation.h(108) : error C2146: syntax error : missing ';' before identifier 'BOOST_CLASS_EXPORT_GUID' f:\xenocide\xenocide\src\common\simulation\simulation.h(108) : error C2059: syntax error : 'string' f:\xenocide\xenocide\src\common\simulation\simulation.h(109) : error C2143: syntax error : missing ';' before '}'
When I put it outside the namespace I have to use a fully qualified name including the namespace for class B, so it becomes
BOOST_SHARED_POINTER_EXPORT(MyNamespace::B)
Then I get (not Xenocide is here what MyNamespace is in my example): f:\xenocide\xenocide\src\common\simulation\simulation.h(115) : error C2653: '__shared_ptr_Xenocide' : is not a class or namespace name f:\xenocide\xenocide\src\common\simulation\simulation.h(115) : error C2653: '__shared_ptr_Xenocide' : is not a class or namespace name
I also tried various combinations with BOOST_SHARED_POINTER_EXPORT_GUID but it didn't help.
Can someone explain to me how I have to declare shared_ptr's in order for them to work with boost::serialization? I was unable to find some more indepth documentation.
I've modified shared_ptr.hpp as follows: // This macro is used to export GUIDS for shared pointers to allow // the serialization system to export them properly. David Tonge //#define BOOST_SHARED_POINTER_EXPORT_GUID(T, K) \ // typedef boost::detail::sp_counted_base_impl< \ // T *, \ // boost::checked_deleter< T > \ // > __shared_ptr_ ## T; \ // BOOST_CLASS_EXPORT_GUID(__shared_ptr_ ## T, "__shared_ptr_" K)\ // BOOST_CLASS_EXPORT_GUID(T, K) \ // /**/ /**/ #define BOOST_SHARED_POINTER_EXPORT_GUID(T,N) \ typedef boost::detail::sp_counted_base_impl< \ T *, \ boost::checked_deleter< T > \ > __shared_ptr_ ## N; \ BOOST_CLASS_EXPORT(__shared_ptr_ ## N) \ BOOST_CLASS_EXPORT(T) \ /**/ #define BOOST_SHARED_POINTER_EXPORT(T) \ BOOST_SHARED_POINTER_EXPORT_GUID( \ T, \ BOOST_PP_STRINGIZE(T) \ ) \ /**/ #endif // BOOST_SERIALIZATION_SHARED_PTR_HPP Then I've got a separate .cpp file and use like so: #define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> #include <boost/serialization/export.hpp> ... BOOST_SHARED_POINTER_EXPORT_GUID( Adv::CAssembly, AdvCAssembly ); This allows me to serialize shared_ptr<Adv::CAssembly>'s properly. The BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP is necessary to avoid MSVC7.1 compiler crashes with boost 1.32. I mentioned this to Robert Ramey some time back. I'm not sure if these changes were made to the CVS. Jeff Flinn