我有一个以下字段的对象:
boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_;
我想序列化它,但似乎std :: shared_ptr无法以简单的方式序列化
任何人都有解决方案吗?
答案 0 :(得分:11)
我怀疑你错过了一个包含,
#include <boost/serialization/shared_ptr.hpp>
此外,该示例使其看起来像别名,默认情况下会处理周期。
_当然,循环会导致shared_ptr潜在的内存泄漏与序列化无关,你仍然需要注意那些(通过避免循环或明智地使用weak_ptr)_
另见:
答案 1 :(得分:-5)
不幸的是,答案是没有一种简单的方法可以将任何指针串行化,因为当你重新加载数据时,你的数据的内存布局可能会有所不同。一个能够处理指针的串行器会需要非常智能,并提出一个'内存布局'来保存到存储结构中具有有效指针地址的光盘,然后在结构被反序列化时重写它们以便获得指向指针的指针加载完成后的正确位置。
真正有趣的部分是,如果你允许可串行结构中的指针,你必须能够处理循环参考图。此外,shared_ptr
保留内部引用计数和记帐信息,以便它知道何时销毁对象,因此序列化程序需要知道所有这些如何工作,以便正确记录引用计数(并忽略引用来自shared_ptr
对象,这些对象不在序列化树中但指向内部思考。)
基本上这是一个巨大的麻烦,这就是为什么序列化库默认不这样做的原因。如果你想这样做,你通常最终需要非常具体的自定义行为,所以他们会让你实现它,以确保它正确完成。