如何通过 getter 函数序列化包含指针的类?

Posted

技术标签:

【中文标题】如何通过 getter 函数序列化包含指针的类?【英文标题】:How do I serialize a class containing pointer via a getter function? 【发布时间】:2013-09-29 12:43:53 【问题描述】:

假设我有一个类A,其中包含一个私有成员B const * p,它可以通过公共函数B const& A::get() 访问。如何序列化函数 A 使用 boost save_construct_dataload_construct_data 函数?

这是我包含的尝试(请注意,此示例说明了问题本身,而不是我使用此 get 函数的原因):

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

#include <fstream>

class B

public:
    int a;

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

class A

public:
    A(B const * p) : p(p) 
    B const& get() const return *p;
private:
    B const * p;

    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)
;

namespace boost 
 
    namespace serialization 
    
        template<class Archive>
        inline void save_construct_data(
        Archive & ar, A const * t, unsigned const int file_version
        )
        
            ar << &t->get();
        

        template<class Archive>
        inline void load_construct_data(
        Archive & ar, A * t, const unsigned int file_version
        )
        
            B const * p;
            ar >> p;

            ::new(t) A(p);
        
    


// 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()



错误是:error C2679: binary '&lt;&lt;' : no operator found which takes a right-hand operand of type 'const B *' (or there is no acceptable conversion)

【问题讨论】:

【参考方案1】:

你不能序列化一个临时的(AFAICT 是 Boost 限制)。

B const * p = &t->get();
ar << p;

【讨论】:

以上是关于如何通过 getter 函数序列化包含指针的类?的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化包含指向原语的指针的类?

返回指向类中的类的指针

2020.5.4 从前序与中序遍历序列构造二叉树 中等 105

序列化指向没有默认构造函数的类的指针时无法覆盖 save_construct_data

具有包含另一个类的函数指针的映射的类

在 C++ 中为具有包含指针的集合的类编写复制构造函数