$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Anders Wang Kristensen (awk_at_[hidden])
Date: 2007-01-18 17:10:05
Hi,
I sometimes use shared_ptr<const X> to share read-only resources between 
different classes.
However serializing shared_ptr<const X> causes problems as shown in the 
attached code.
Saving is no problem, but loading fails to compile with an error about 
converting from const to non-const.
I managed to make it compile and run by splitting serialize into load/save.
Save is as before, but in load I deserialize into a shared_ptr<X> (no const) 
and just assign that to the const version.
Is this the preferred way?  It seems like a hack since I'm saving as one 
type and loading as another, albeit closely related, type.
Thanks.
-- Anders
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <fstream>
class B
{
public:
 int x;
 friend class boost::serialization::access;
 template<class Archive>
 void serialize(Archive & ar, const unsigned int version)
 {
  ar & BOOST_SERIALIZATION_NVP(x);
 }
};
class A
{
public:
 boost::shared_ptr<const B> bar;
 friend class boost::serialization::access;
//This doesn't work..
 template<class Archive>
 void serialize(Archive & ar, const unsigned int version)
 {
  ar & BOOST_SERIALIZATION_NVP(bar);
 }
 /*
 //This works..
 template<class Archive>
 void load(Archive & ar, const unsigned int version)
 {
  boost::shared_ptr<B> tmp;
  ar & BOOST_SERIALIZATION_NVP(tmp);
  bar = tmp;
 }
 template<class Archive>
 void save(Archive & ar, const unsigned int version) const
 {
  ar & BOOST_SERIALIZATION_NVP(bar);
 }
 BOOST_SERIALIZATION_SPLIT_MEMBER()
 */
};
int main(int argc, const char* argv[])
{
 {
  boost::shared_ptr<B> b(new B);
  b->x = 17;
  A a = { b };
  std::ofstream ofs("test.xml");
  boost::archive::xml_oarchive oa(ofs);
  oa << BOOST_SERIALIZATION_NVP(a);
 }
 {
  A a;
  std::ifstream ifs("test.xml");
  boost::archive::xml_iarchive ia(ifs);
  ia >> BOOST_SERIALIZATION_NVP(a);
 }
}