2012-03-30 79 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