2015-04-06 90 views
3

我有以下枚舉boost :: archive :: binary_oarchive如何處理枚舉?

enum Example : uint8_t { 
    First = 1, 
    Second = 2, 
}; 

和字符串流:

std::stringstream stream; 
boost::archive::binary_oarchive ar(stream); 

現在我已經注意到了,如果我序列化的枚舉:

ar << Example::First; 

升壓連載4字節(在這種情況下0x01,0x00,0x00,0x00)位而不是所需的8位(0x01)爲uint8_t。 有什麼辦法可以避免這種情況?我的意思是,我知道我可以將這個枚舉賦予uint8_t,但這個接縫不是很聰明(如果我必須這樣做,我必須改變很多東西)。

感謝和問候

+0

具有特定類型背景的枚舉是一個新的(ish)C++ 11功能,並且仍然有很大一部分是專門爲C++ 03設計的boost。這是_possible_這是'boost'不知道'新'語言功能的情況,並且boost需要更新。 –

+0

我無法確定這是否是[如何在Boost中更改默認枚舉序列化的副本。序列化](http://stackoverflow.com/questions/7635534/how-to-change-the-default-enums-serialization-in-boost-serialization)或不。 –

+0

我發現一個錯誤,其中強化類型枚舉失敗,並且它被關閉爲「無效」。不知道這是否意味着無意支持它或什麼。 https://svn.boost.org/trac/boost/ticket/6068 –

回答

3

像往常一樣與升壓序列化,定製你需要實現定製點這是任何一名成員serialize/load/save或無功能serialize/load/save用戶定義類型的治療(擡頭通過ADL)。

由於成員函數不是枚舉的選項,因此您需要爲您的類型提供過載,例如serialize。可悲的是,沒有辦法得到一個通用的實現,比內置原語類型的預定義重載「更好」。

這裏是會接近(但它不工作¹):

namespace boost { namespace serialization { 

     template <typename Ar, typename T> 
      typename std::enable_if<std::is_enum<T>::value, void>::type 
      serialize(Ar& ar, T& e, unsigned) 
      { 
       ar & boost::serialization::make_binary_object(&e, sizeof(e)); 
      } 

} } 

我們可以通過定義,枚舉有積分值作爲以「binary_object」序列化的快捷方式,因爲我們知道他們的基礎類型,這使它們成爲POD。

在此的光 - 不幸 - 限制,也許最好的方法是手動調用make_binary_object如圖所示:

Live On Coliru

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
#include <boost/serialization/binary_object.hpp> 
#include <boost/serialization/serialization.hpp> 
#include <iostream> 
#include <sstream> 

using boost::serialization::make_binary_object; 

enum class Example : uint8_t { 
    First = 1, 
    Second = 2, 
}; 

int main() { 

    std::stringstream stream; 
    boost::archive::binary_oarchive ar(stream, boost::archive::no_header); 

    auto data = Example::First; 
    ar << make_binary_object(&data, sizeof(data)); 

    std::cout << "Size: " << stream.str().size() << "\n"; 
} 

哪個打印

Size: 1 
如預期的那樣,

。您可以使用serialize實現中的make_binary_object包裝器,它將透明地處理序列化和反序列化。

請參見:Boost Serialization Wrappers Boost文檔中


¹出於同樣的原因,BOOST_IS_BITWISE_SERIALIZABLE(Example)將無法​​正常工作;我測試了它