2011-10-03 51 views
1

默認情況下,在Boost.Serialization中,枚舉類型被序列化爲32位整數。但我需要序列化一些枚舉類型作爲不同的寬度整數。我試圖專門化boost :: serialization :: serialize方法,但它似乎不適用於枚舉。如何更改Boost.Serialization中的默認枚舉序列化

這裏是我的嘗試:

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

您可以將枚舉封裝在類中並序列化類嗎? – Dan

+0

我認爲這也行不通。 –

回答

1

這可能不起作用,因爲枚舉是不是一個真正的類型,我不認爲你可以在一般的過載特定枚舉函數。

通過在包含MyEnum_t的任何對象的序列化中轉換爲char,您可以完成所需的操作。你也可以做Dan建議的內容,並將enum封裝在一個可以重載序列化的第一類類型中。例如:

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

    // serialization... 
}; 

儘管如此,這仍然不會完全透明。

但是,我不明白你爲什麼關心類型是如何序列化的。只要可以正確恢復對象,是不是需要關心序列化的內部表示的序列化點。內部表示看起來像檔案的一個屬性。