2012-03-30 57 views
9

我有一個對象,以下字段:升壓序列化和std :: shared_ptr的

boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_; 

我想序列化,但它似乎的std :: shared_ptr的,不能以簡單的方式

連載

任何人都有解決方案?

+0

您是不是要找寫'提振:: shared_ptr'而不是'STD :: shared_ptr'? – aldo 2012-03-30 16:32:05

+0

是的初始化我想使用std :: shared_ptr,但是使用boost :: shared_ptr和正確的#include一切正常,所以我會繼續使用boost,感謝您的評論。 – Guillaume07 2012-04-02 09:42:15

回答

11

我懷疑你缺少一個包括

#include <boost/serialization/shared_ptr.hpp> 

link, at the bottom

此外,例如使它看起來像鋸齒和週期默認的照顧。

_Of當然,有周期將導致與shared_ptr的什麼都沒有做系列化潛在的內存泄漏,您仍然有(避免循環或明智地使用了weak_ptr的)理會那些_

見也:

+0

真的很好直覺 – Guillaume07 2012-03-31 09:16:37

-5

不幸的是,答案是沒有一種簡單的方法來將其中的指針序列化爲任何東西,因爲當您將數據加載回來時,數據的內存佈局可能會有所不同。能夠處理指針的序列化程序將需要非常聰明,並提出一個'內存佈局'來保存到存儲結構中具有有效指針地址的光盤上,然後在結構被反序列化時將其重寫,以便指向指向加載完成後的正確位置。

真正有趣的部分是,如果你允許指針在可串行結構中,你必須能夠處理循環參考圖。此外,shared_ptr保留內部引用計數和會計信息,以便它知道何時銷燬一個對象,因此序列化程序需要知道所有有關如何工作,以便正確記錄引用計數(並忽略來自shared_ptr對象的引用不在序列化的樹內,但指向內部思考)。

基本上它是一個巨大的令人頭疼的問題,這就是爲什麼序列化庫默認不會這樣做。如果您想要這樣做,您通常最終需要非常特定的自定義行爲,因此他們會將其留給您來實現,以確保正確完成。

+1

現在,您是否建議Boost Serialization無法應對您提到的複雜性?我很確定它可以。請參閱教程演示:http://www.boost.org/doc/libs/1_49_0/libs/serialization/example/demo.cpp – sehe 2012-03-30 14:07:13

+0

除STL容器外,該示例中沒有任何內容與其中的指針串聯起來(這當然使用他們內部),它明確指出已經在序列化庫中有特定的支持。但是,該示例確實展示瞭如何爲您自己的類型提供序列化行爲,這是您用來將庫默認知識無法處理的任何內容序列化的鉤子。 – 2012-03-30 14:12:51

+0

'std :: list > schedule;'和'typedef bus_stop * bus_stop_pointer; std :: list 停止;' - 和** yes **公交車站在路線之間共享。我想知道你點擊了什麼鏈接? – sehe 2012-03-30 14:17:45