2012-02-22 23 views
2

考慮的結構序列化:boost :: serialization :: traits的具體示例?

struct MyStruct { 
    int a; 
    std::string b; 

template<class Archive> 
void serialize(Archive &ar, const unsigned int) 
    { 
    ar & a & b; 
    } 
}; 

我想明確地標記它,使用boost ::系列化::特質,既track_neverobject_serializable。我盯着traits docs,但似乎無法解釋如何應用它,並且無法在任何地方找到示例。所以...

a)什麼是將特徵應用於這個特定類的代碼是什麼?

b)什麼是BOOST_STATIC_ASSERT()驗證每個到位?

c)我假設我不能創建這個類primitive_type,因爲在典型的歸檔類中沒有可以直接處理這種類型的成員函數或模板。正確?

我不關心跨平臺或跨版本存檔的兼容性,只是快速讀取(並寫入)和入侵MyStruct是好的,但如果可能的話,它會很好地看到它完成兩種方式。

回答

2

由於MyStruct不是一個模板化的結構或類應用,所有你需要做的就是使用BOOST_CLASS_IMPLEMENTATIONBOOST_CLASS_TRACKING宏性狀:

外類定義的你需要以下兩行寫:

BOOST_CLASS_IMPLEMENTATION(MyStruct, boost::serialization::object_serializable); 
BOOST_CLASS_TRACKING(MyStruct, boost::serialization::track_never); 

一個BOOST_STATIC_ASSERT()來驗證你正在做正確的事情是這樣的:

BOOST_STATIC_ASSERT(boost::serialization::implementation_level<MyStruct>::value 
        == boost::serialization::object_serializable); 
BOOST_STATIC_ASSERT(boost::serialization::tracking_level<MyStruct>::value 
        == boost::serialization::track_never); 

我想說這是一個原始類型,因爲它不是一個原始類型是沒有意義的。

+1

事實證明,上述兩個宏需要按照您放置它們的順序。我讓他們逆轉了,這就是爲什麼它不適合我。最後的分號不是必需的,但不會造成傷害。 (順便說一句,這是所有的MinGW-32/gcc-4.4。) – JimB 2012-02-22 23:48:52