如何更改Boost.Serialization中的默认枚举序列化

时间:2011-10-03 13:19:44

标签: c++ serialization boost

默认情况下,在Boost.Serialization中,枚举类型被序列化为32位整数。但我需要将一些枚举类型序列化为不同的宽度整数。我试图专门研究boost :: serialization :: serialize方法,但它似乎不适用于枚举。

这是我的尝试:

#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;
} 

1 个答案:

答案 0 :(得分:1)

这可能不起作用,因为枚举不是真正的类型,我认为你不能为一个特定的枚举重载一个函数。

您可以通过在包含MyEnum_t的任何对象的序列化中转换为char来完成您想要的任务。您也可以执行Dan建议的操作,并将枚举封装在一个可以重载序列化的第一类类型中。类似的东西:

class MyEnum_clone {
  unsigned char v_;
  MyEnum_clone(MyEnum_t v) : v_(v) {};
  operator MyEnum_t() const {return MyEnum_t(v_); };

  // serialization...
};

但是,这仍然可能不会完全透明。

但是,我不明白为什么你关心如何序列化类型。序列化的重点不在于您不必关心序列化的内部表示,只要您可以正确地还原对象即可。内部表示似乎是存档的属性。