【问题标题】:c++11 shared_ptr + Boost::Serializationc++11 shared_ptr + Boost::序列化
【发布时间】:2012-10-05 04:09:41
【问题描述】:

我需要 std::shared_ptr 的 Boost::Serialization 专业化。

我正在编写一个通过 Boost::Asio 发送对象的程序,其中许多对象在内部使用 shared_ptrs。使用一种解决方法来仅序列化它们所引用的对象是非常不舒服的。

我一直在尝试自己制作,查看为 Boost::shared_ptr 提供的实现,但我对如何处理这些对象缺乏了解。

在 Boost::shared_ptr 序列化中更改命名空间可以序列化指针,但反序列化对我不起作用。

作为最后的手段,我可​​以(也许应该)切换到对我的对象使用 std::unique_ptrs,因为目前看来他们拥有它们,但这会导致我遇到同样的问题,只是带有 unique_ptr。

【问题讨论】:

  • 您绝对应该更喜欢 std::unique_ptr 而不是 std::shared_ptr 在适用的情况下

标签: c++ serialization boost shared-ptr


【解决方案1】:

你说你在内部使用std::shared_ptr。那么为什么不使用boost::shared_ptr 来代替它,它完全被boost::serialization 支持并且具有与std::shared_ptr 相同的功能呢?

【讨论】:

  • 我的主要论点是尽可能地坚持标准实现,只使用其他库来处理 c++ 标准所没有的东西。如果可能的话,我会把它作为最后的解决方案。
  • 您正在使用boost 进行序列化,因此您的程序与支持它的编译器兼容!!那么为什么你不想使用boost::shared_ptr 那是std::shared_ptr 的来源。它和std::shared_ptr一样标准,甚至支持更多的平台和编译器,那么使用它有什么问题呢??
  • @BigBoss 我理解你的论点,但是“它和std::shared_ptr 一样标准” - 不,它不是。
  • 为什么你说不是?请记住,您已经包含了booststd 只是另一个在所有编译器上实现并适当支持标准的库,那么boost 是什么?它不是一个具有相同目的的库,它与所有平台的兼容性由一大群程序员维护吗?许多标准来自boost(就像shared_ptr 本身一样!!但如果你想在shared_ptr 之前使用std::,那就另当别论了
  • Boost 的实现略有不同,因此是非标准的。请记住,这里不是讨论这个的地方,因为讨论与主题无关。
【解决方案2】:

我不确定这是否是最好的方法,但它似乎有效。

更改命名空间并将此加载方法添加到从 Boost::shared_ptr 专业化复制的 shared_ptr 专业化标头中:

template<class Archive, class T>
inline void load(
    Archive & ar,
    std::shared_ptr< T > &t,
    const unsigned int /* file_version */
){
    T * t_ptr;
    ar >> boost::serialization::make_nvp("px", t_ptr);
    t = std::shared_ptr<T>(t_ptr);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2020-10-03
    • 2023-03-15
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多