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