2011-07-07 86 views
0

我有一個映射類,我想使用boost serialize序列化這個類。boost :: serialization僅序列化映射的鍵

std::map<int, ComplicatedThing> stuff; 

ComplicatedThing可以通過知道int來導出。我想要有效地序列化這個。一種方法(ick,但是有效)是製作密鑰的矢量並且序列化矢量。

// illustrative, not test-compiled 
std::vector<int> v; 
std::copy(stuff.begin, stuff.end, std::back_inserter(v)); 
// or 
for(std::vector<int> it = v.begin(); it != v.end(); it++) 
    stuff[*it] = ComplicatedThing(*it); 

// ...and later, at serialize/deserialize time 
template<class Archive> 
void srd::leaf::serialize(Archive &ar, const unsigned int version) 
{ 
    ar & v; 
} 

但這是不雅的。使用BOOST_SERIALIZATION_SPLIT_MEMBER()和加載/保存方法,我想我應該能夠完全跳過中間向量的分配。在那裏我卡住了。

也許我的答案在於理解boost/serialization/collections_load_imp.hpp。希望有一個更簡單的路徑。

回答

0

你可以序列化它作爲列表int(我不是指std::list)而不是序列化它作爲一個容器(地圖或矢量)。先寫一些元素,然後逐個寫出,然後相應地去解析。這是10分鐘的任務。如果你需要在很多地方這種解決方案,包地圖在你的類,併爲它定義

+0

謝謝。序列化是直接的那樣,當然: 的(IT = v.begin();它= v.end();它++!) AR & *it; 但deserialzing循環尚不清楚。或者你的意思是 ar&v.size(); (it = v.begin(); it!= v.end(); it ++) ar & *it; 這樣我就可以構建一個循環加載? – jma

+0

拳頭寫一些元素和它們一個接一個,相應解除排列 –

+0

對,我正在密集。一旦我完成它就變得很清楚了。 – jma

0

如果你想讓它不看笨拙系列化,使用range adaptors

ar & (stuff | transformed(boost::bind(&map_type::value_type::first, _1)); 

或者,如果你有合適的標題,我想你可以這樣減少

ar & (stuff | transformed(&map_type::value_type::first)) 

免責聲明

相關問題