【问题标题】:How do I make boost::serialization work with std::shared_ptr?如何使 boost::serialization 与 std::shared_ptr 一起工作?
【发布时间】:2013-09-28 06:49:41
【问题描述】:

这个问题已经在asked here 和其他几个地方提出,但答案似乎并没有真正解决最新的 Boost 库。

为了说明这个问题,假设我们想要序列化一个包含共享指针 (std::shared_ptr) 的类,以及一个将从文件构建类的静态 load 函数和一个将存储实例到文件:

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/shared_ptr.hpp>

#include <fstream>
#include <memory>
#include <vector>

class A
{
public:
    std::shared_ptr<int> v;

    void A::Save(char * const filename);
    static A * const Load(char * const filename);

        //////////////////////////////////
        // Boost Serialization:
        //
    private:
        friend class boost::serialization::access;
        template<class Archive> void serialize(Archive & ar, const unsigned int file_version) 
        {
            ar & v;
        }
};

// save the world to a file:
void A::Save(char * const filename)
{
    // create and open a character archive for output
    std::ofstream ofs(filename);

    // save data to archive
    {
        boost::archive::text_oarchive oa(ofs);

        // write the pointer to file
        oa << this;
    }
}

// load world from file
A * const A::Load(char * const filename)
{
    A * a;

    // create and open an archive for input
    std::ifstream ifs(filename);

    boost::archive::text_iarchive ia(ifs);

    // read class pointer from archive
    ia >> a;

    return a;
}

int main()
{

}

上面的代码生成了一长串以c:\local\boost_1_54_0\boost\serialization\access.hpp(118): error C2039: 'serialize' : is not a member of 'std::shared_ptr&lt;_Ty&gt;' 开头的错误,据我所知,鉴于我已经加载了表面上支持std::shared_ptr 的boost shared_ptr 序列化库,这不应该是真的。我在这里错过了什么?

注意:据我了解,我假设 boost/serialization/shared_ptr.hppserialize 定义了 serialize 函数std::shared_ptr 是错误的,因此这个问题的正确答案可能是我要么必须定义我自己的serialize 函数为std::shared_ptr 或转换为boost::shared_ptr

【问题讨论】:

    标签: c++ boost boost-serialization


    【解决方案1】:

    这是我自己能想到的最佳答案。如果有人对此有更好的看法,我会接受它作为答案。

    boost 附带的boost/serialization/shared_ptr.hpp 标头支持std::shared_ptr,而是支持boost::shared_ptr。如果您想让共享指针对象的序列化工作盗用您自己的序列化代码,那么您需要将您的std::shared_ptr 对象转换为boost::shared_ptr 对象和live with the consequences

    我的误解是我认为boost/serialization/shared_ptr.hppstd::shared_ptr 定义了一个serialize 方法。我错了。

    【讨论】:

    • std::shared_ptrboost::shared_ptr 的转换我已经看到stores 作为一个析构函数,一个可变的lambda,它通过值std::shared_ptr 捕获。所以如果你想序列化这种结构,你仍然需要一种方法来序列化析构函数,因此std::shared_ptr。所以这是鸡和蛋的问题。您是否知道其他转化方式有所不同?
    【解决方案2】:

    不,std::shared_ptr 和 boost::shared_ptr 是不相关的类模板。

    Boost.Serizalization 不支持开箱即用的 std::shared_ptr,但您可以在应用程序中添加此类支持 - 只需查看 &lt;boost/serialization/shared_ptr.hpp&gt; 标头即可。

    【讨论】:

    • 我知道这一点;这是我的问题的基础。
    • @ausairman 那么你的问题不清楚。您声明“Boost 1.54,<...> 应该支持 std::shared_ptr” - 这是不正确的。
    • 好的。我现在已经明确声明我正在尝试使用 boost/serialization/shared_ptr.hpp 标头。
    • 另外,我的理解是它确实支持std::shared_ptr;为什么它会附带一个为它定义序列化方法的标头?
    • 对不起,我想我误解了那个库的使用和你的答案。你是说boost/serialization/shared_ptr.hpp 标头不是std::shared_ptr 的序列化吗?
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2012-02-24
    • 2015-06-21
    • 2018-02-19
    相关资源
    最近更新 更多