$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Craigp (craigp_at_[hidden])
Date: 2003-10-05 21:13:58
For XML serialization, container element names seem to be hardcoded to
'item'. Is it possible to override this? Partial specialization worked, but
I had to make save_collection a class (I renamed it to archive_output_seq to
mirror archive_input_seq), and, well, I used partial specialization. :-) Is
there a better way of overriding container element names? If not, can you
make save_collection a class, so we can partially specialize it?
Thanks for the great library!
FWIW, these are the macros I came up with:
#define CONTAINER_ELEMENT_NAME(T, name)                               \
namespace boost{                                                      \
namespace serialization {                                             \
namespace stl {                                                       \
template<class Archive>                                               \
struct archive_input_seq<Archive, typename T>                         \
{                                                                     \
    inline void operator()(Archive &ar, T &s)                         \
    {                                                                 \
        BOOST_DEDUCED_TYPENAME T::value_type t;                       \
        ar >> make_nvp(name, t);                                      \
        s.push_back(t);                                               \
    }                                                                 \
};                                                                    \
template<class Archive>                                               \
struct archive_output_seq<Archive, typename T>                        \
{                                                                     \
    inline void operator()(Archive &ar, const T &s)                   \
    {                                                                 \
      T::size_type count = s.size();                                  \
      ar << BOOST_SERIALIZATION_NVP(count);                           \
      BOOST_DEDUCED_TYPENAME T::const_iterator it = s.begin();        \
      while( count-- > 0 ) {                                          \
          ar << make_nvp(name, *it++);                                \
      }                                                               \
    }                                                                 \
};                                                                    \
}}}
CONTAINER_ELEMENT_NAME(MR_Map::MapTiles, "Tile");
CONTAINER_ELEMENT_NAME(MR_MapTile::Clearings, "Clearing");
CONTAINER_ELEMENT_NAME(MR_MapTile::Paths, "Path");