首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用std::shared_ptr进行boost::序列化工作?

如何使用std::shared_ptr进行boost::序列化工作?
EN

Stack Overflow用户
提问于 2013-09-28 06:49:41
回答 2查看 1.5K关注 0票数 1

这个问题一直是asked here和其他一些地方,但答案似乎并没有真正解决最新的Boost库。

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

代码语言:javascript
复制
#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<_Ty>'开始生成一个很长的错误列表,据我所知,由于我加载了表面上支持std::shared_ptr的boost shared_ptr序列化库,这不应该是正确的。我在这里错过了什么?

注意:据我所知,我认为boost/serialization/shared_ptr.hpp std::shared_ptr 定义了 serialize 函数的假设是错误的,因此,对这个问题的正确答案可能是,我必须为E 229 std::shared_ptr E 133定义自己的 serialize 函数,或者转换为E 234 boost::shared_ptr

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-28 08:56:30

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

Boost.Serizalization不支持开箱即用的std::shared_ptr,但是您可以在应用程序中添加这样的支持--只需查看<boost/serialization/shared_ptr.hpp>头。

票数 1
EN

Stack Overflow用户

发布于 2013-09-29 00:46:31

,这是我自己想出的最好的答案。如果有人对此有更好的看法,我会接受这个答案。

增强工具的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方法。我错了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19064221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档