Как изменить сериализацию перечислений по умолчанию в Boost.Serialization - PullRequest
1 голос
/ 03 октября 2011

По умолчанию в Boost.Serialization типы перечислений сериализуются как 32-разрядное целое число.Но мне нужно сериализовать некоторые типы enum как целое число различной ширины.Я пытался специализировать метод 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 Ответ

1 голос
/ 28 ноября 2011

Это, вероятно, не работает, потому что перечисления не являются реальными типами, я не думаю, что вы можете вообще перегружать функцию для определенного перечисления.

Вы можете выполнить то, что вы хотите, выполнив преобразование в char при сериализации любого объекта, содержащего ваш MyEnum_t. Вы также можете сделать то, что предложил Дэн, и инкапсулировать перечисление в первоклассном типе, для которого вы можете перегружать сериализацию. Что-то вроде:

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

  // serialization...
};

Это все еще, вероятно, не будет полностью прозрачным, хотя.

Однако я не понимаю, почему вас волнует, как тип сериализуется. Не стоит ли сериализовывать, что вам не нужно заботиться о внутреннем представлении сериализации, если вы можете правильно восстановить объект. Внутреннее представление выглядит как свойство архива.

...