我有一個對象,以下字段:升壓序列化和std :: shared_ptr的
boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_;
我想序列化,但它似乎的std :: shared_ptr的,不能以簡單的方式
連載任何人都有解決方案?
我有一個對象,以下字段:升壓序列化和std :: shared_ptr的
boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_;
我想序列化,但它似乎的std :: shared_ptr的,不能以簡單的方式
連載任何人都有解決方案?
我懷疑你缺少一個包括
#include <boost/serialization/shared_ptr.hpp>
此外,例如使它看起來像鋸齒和週期默認的照顧。
_Of當然,有周期將導致與shared_ptr的什麼都沒有做系列化潛在的內存泄漏,您仍然有(避免循環或明智地使用了weak_ptr的)理會那些_
見也:
真的很好直覺 – Guillaume07 2012-03-31 09:16:37
不幸的是,答案是沒有一種簡單的方法來將其中的指針序列化爲任何東西,因爲當您將數據加載回來時,數據的內存佈局可能會有所不同。能夠處理指針的序列化程序將需要非常聰明,並提出一個'內存佈局'來保存到存儲結構中具有有效指針地址的光盤上,然後在結構被反序列化時將其重寫,以便指向指向加載完成後的正確位置。
真正有趣的部分是,如果你允許指針在可串行結構中,你必須能夠處理循環參考圖。此外,shared_ptr
保留內部引用計數和會計信息,以便它知道何時銷燬一個對象,因此序列化程序需要知道所有有關如何工作,以便正確記錄引用計數(並忽略來自shared_ptr
對象的引用不在序列化的樹內,但指向內部思考)。
基本上它是一個巨大的令人頭疼的問題,這就是爲什麼序列化庫默認不會這樣做。如果您想要這樣做,您通常最終需要非常特定的自定義行爲,因此他們會將其留給您來實現,以確保正確完成。
現在,您是否建議Boost Serialization無法應對您提到的複雜性?我很確定它可以。請參閱教程演示:http://www.boost.org/doc/libs/1_49_0/libs/serialization/example/demo.cpp – sehe 2012-03-30 14:07:13
除STL容器外,該示例中沒有任何內容與其中的指針串聯起來(這當然使用他們內部),它明確指出已經在序列化庫中有特定的支持。但是,該示例確實展示瞭如何爲您自己的類型提供序列化行爲,這是您用來將庫默認知識無法處理的任何內容序列化的鉤子。 – 2012-03-30 14:12:51
'std :: list
您是不是要找寫'提振:: shared_ptr'而不是'STD :: shared_ptr'? – aldo 2012-03-30 16:32:05
是的初始化我想使用std :: shared_ptr,但是使用boost :: shared_ptr和正確的#include一切正常,所以我會繼續使用boost,感謝您的評論。 – Guillaume07 2012-04-02 09:42:15