我有一个对象,以下字段:升压序列化和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