
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
#include 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