【问题标题】:Boost shared_ptr serialization提升 shared_ptr 序列化
【发布时间】:2012-11-25 14:04:15
【问题描述】:

我已经为 OpenCVs Mat 格式实现了序列化,如下所述:Serializing OpenCV Mat_<Vec3f>

我现在遇到了序列化指向 cv::Mat 的共享指针的问题。 它给出了以下错误:

/usr/include/boost/serialization/shared_ptr.hpp: In function ‘void boost::serialization::serialize(Archive&, boost::shared_ptr<U>&, unsigned int) [with Archive = boost::archive::text_iarchive, T = boost::shared_ptr<cv::Mat>]’: /usr/include/boost/serialization/serialization.hpp:128:9

从'void >boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = >boost::archive::text_iarchive, T = boost::shared_ptr >]' /usr/include/boost/archive/detail/iserializer.hpp:188:5:

实例化自 'void >boost::archive::detail::iserializer::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive:: text_iarchive, T = boost::shared_ptr >]' 识别2d3d.cpp:227:1: 从这里实例化

/usr/include/boost/serialization/shared_ptr.hpp:167:5:错误:静态断言失败:“boost::serialization::tracking_level::value != boost::serialization::track_never” `

我尝试使用 BOOST_CLASS_TRACKING,但无法正常工作。其实我真的不明白问题是什么,阅读boost文档无助于解决这个问题。

【问题讨论】:

  • 如果您收到此错误,那么该类型的跟踪可能已禁用?寻找类似BOOST_CLASS_TRACKING(cv::Mat, boost::serialization::track_never)的东西。

标签: serialization boost


【解决方案1】:

我认为除非指向的对象具有 vtable,否则您不能通过 shared_ptr 进行序列化。尝试将对象的析构函数设为虚拟。

编辑:或者,将对象(OpenCV 矩阵?)包装在具有虚拟析构函数的对象中。

【讨论】:

  • 我能够使用 clang 和 gcc 将 boost::shared_ptr 序列化为没有虚拟析构函数 struct A{ double d_; A(double d = 0) : d_(d){} template&lt;class Archive&gt; void serialize(Archive&amp; ar, unsigned = 0){ ar &amp; boost::serialization::make_nvp("d", d_); } }; 的类。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2016-06-02
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多