Boost logo

Boost Users :

Subject: Re: [Boost-users] Serialization of a std::vector< boost::shared_ptr< A> > throws unregistered_class exception
From: Benoit Gagnon (b.gagnon_at_[hidden])
Date: 2009-03-20 14:27:08


On Mar 19, 10:26 am, Benoit Gagnon <b.gag..._at_[hidden]> wrote:
> On Mar 19, 9:58 am, "Robert Ramey" <ra..._at_[hidden]> wrote:
>
> > Depending on which version of boost you're using. You may have
> > to include a special macro - look into serialization/shared_ptr.hpp
> > at the end.
>
> > Robert Ramey
>
> I'm using Boost 1.34.1.
> The only macro I see in serialization/shared_ptr.hpp is
> BOOST_SERIALIZATION_SHARED_PTR.
>
> Am I missing something?
>

I still haven't figured this out, if anyone has clues...
Should I make a wrapper class around the std::vector and implement
serialization for it?

> > Benoit Gagnon wrote:
> > > Given the following classes:
>
> > >   class Building { ... };
> > >   class House : public Building { ... };
> > >   class Hospital : public Building { ... };
>
> > > With appropriate serialization method templates such as:
>
> > >   class House: public Building {
> > >   friend class boost::serialization::access;
> > >   template<class Archive>
> > >   void serialize(Archive& ar, const unsigned int version ) {
> > >       ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Building );
> > >       ar & BOOST_SERIALIZATION_NVP( mNumBedrooms );
> > >       ar & BOOST_SERIALIZATION_NVP( mNumBathrooms );
> > >   }
> > >   ...
>
> > > I have the following registrations in main.cpp where the archiving/
> > > restoring is performed:
>
> > >   BOOST_SERIALIZATION_SHARED_PTR( Building )
> > >   BOOST_SERIALIZATION_SHARED_PTR( House )
> > >   BOOST_SERIALIZATION_SHARED_PTR( Hospital )
>
> > > In main.ccp, I would like to serialize a std::vector<
> > > boost::shared_ptr< Building > > object.
> > > Like this:
>
> > >   std::vector< boost::shared_ptr< Building > > buildings;
> > >   ...
> > >   std::ofstream ofs( "archive.txt" );
> > >   boost::archive::text_oarchive oa( ofs );
> > >   oa & BOOST_SERIALIZATION_NVP( buildings );
>
> > > This compiles correctly but fails at runtime with a
> > > "unregistered_class" exception. The individual classes (Building,
> > > House, Hospital) can be serialized and restored fine individually.
> > > That is true for objects, pointers and shared_ptr. A vector of plain
> > > pointers to any of those types also works fine. But a vector of
> > > shared_ptr to any of those types fails at runtime..
>
> > > What kind of registration must be done to achieve this?
>
> > _______________________________________________
> > Boost-users mailing list
> > Boost-us..._at_[hidden]http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
> _______________________________________________
> Boost-users mailing list
> Boost-us..._at_[hidden]http://lists.boost.org/mailman/listinfo.cgi/boost-users


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net