Boost默认。序列化,枚举类型被序列化为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;
}
这可能不起作用,因为enum不是真正的类型,我认为通常不能为特定的enum重载函数。
您可以通过在包含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...
};
不过,这可能还不是完全透明的。
然而,我不明白为什么你关心类型是如何序列化的。序列化的意义不在于您不必关心序列化的内部表示,而在于您可以正确地恢复对象。内部表示看起来像是存档的一个属性。