gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:06 26 4
gpt4 key购买 nike

默认情况下,在 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;
}

最佳答案

这可能行不通,因为枚举不是真正的类型,我认为您通常不能为特定枚举重载函数。

您可以通过在包含 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...
};

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

但是,我不明白您为什么关心类型是如何序列化的。序列化的意义不就是不用关心序列化的内部表示,只要能正确恢复对象即可。内部表示似乎是存档的属性。

关于c++ - 如何更改 Boost.Serialization 中的默认枚举序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com