Boost logo

Boost Users :

Subject: Re: [Boost-users] How to change the default enums serialization inBoost.Serialization
From: Andrés Senac (andres_at_[hidden])
Date: 2011-10-05 01:48:04


Thanks! Finally, I've made a wrapper as you suggest, but using different
integer widths for different enum types, like this:

template < typename T >
struct enum_wrapper
{
    T m_value;

    enum_wrapper(T t) :
        m_value(t)
    {
    }

    template < typename Archive >
    void serialize(Archive& ar, unsigned int version)
    {
        ar & m_value;
    }
};

template < typename T >
struct serialize_enum_as // redefined to use different integer types
{
    typedef unsigned char type;
};

template< typename Enum >
enum_wrapper< typename serialize_enum_as< Enum >::type > create_wrapper(Enum
e)
{
    return enum_wrapper< typename serialize_enum_as< Enum >::type >(e);
}

....

ar & create_wrapper(e);

Regards,
Andrés

2011/10/4 Robert Ramey <ramey_at_[hidden]>

> **
> Andrés Senac wrote:
> > Hi,
> > By default in Boost.Serialization, enum types are serialized as a
> > 32-bit integer. But I need to serialize some enum types as different
> > width integer. I've tried to specialize the
> > boost::serialization::serialize method, but it seems it doesn't work
> > for enums.
> > Here is my attempt:
> >
> >
> > #include <iostream>
> > #include <boost/archive/binary_oarchive.hpp>
> > #include <boost/asio.hpp>
> >
> >
> > enum MyEnum_t
> > {
> > HELLO, BYE
> > };
> >
> >
> > namespace boost
> > {
> > namespace serialization
> > {
> > template< class Archive >
> > void save(Archive & ar, const MyEnum_t & t, unsigned int version)
> > {
> > unsigned char c = (unsigned char) t;
> > ar & c;
> > }
> > template< class Archive >
> > void load(Archive & ar, MyEnum_t & t, unsigned int version)
> > {
> > unsigned char c;
> > ar & c;
> > t = (MyEnum_t) c;
> > }
> > } // namespace serialization
> > } // namespace boost
> > BOOST_SERIALIZATION_SPLIT_FREE(MyEnum_t)
> >
> >
> > int main(int argc, const char *argv[])
> > {
> > boost::asio::streambuf buf;
> > boost::archive::binary_oarchive pboa(buf);
> > buf.consume(buf.size()); // Ignore headers
> > MyEnum_t me = HELLO;
> > pboa << me;
> > std::cout << buf.size() << std::endl; // buf.size() = 4, but I
> > want 1
> > return 0;
> > }
> >
> >
> > Thanks in advance,
> > Andrés
>
> Consider making a wrapper for you enum - like this;
>
> struct enum_wrapper {
> unsigned char m_value;
> enum_wrapper(unsigned int value) :
> m_value(value)
> {
> assert(value <= 255);
> }
> template<class Archive>
> void save(Archive &ar, unsigned int version){
> ar << m_value;
> }
> void load
> ...
> }
>
> then you can use
>
> ....
> enum {
> a
> b
> ..
> } e;
> ar & enum_wrapper(e);
> ..
>
> Robert Ramey
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>

-- 
Andrés Senac González
andres_at_[hidden], andres.senac_at_[hidden]
+(34) 627550280


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