1

这个问题已经在这里和其他一些地方被问过,但答案似乎并没有真正解决最新的 Boost 库。

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

#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>',据我所知,鉴于我已经加载了shared_ptr表面上支持的 boost 序列化库,这不应该是真的std::shared_ptr。我在这里想念什么?

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

4

2 回答 2

2

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

boost/serialization/shared_ptr.hppboost 附带的标头支持,std::shared_ptr但支持boost::shared_ptr. 如果您想在盗用您自己的序列化代码的情况下使用共享指针对象进行序列化,那么您需要将您的std::shared_ptr对象转换为boost::shared_ptr对象并承担后果

boost/serialization/shared_ptr.hpp我的误解是我认为serializestd::shared_ptr. 我错了。

于 2013-09-29T00:46:31.237 回答
1

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

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

于 2013-09-28T08:56:30.073 回答