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

Posted

技术标签:

【中文标题】如何序列化包含指向原语的指针的类?【英文标题】:How do I serialize a class containing pointers to primitives? 【发布时间】:2013-09-29 09:12:33 【问题描述】:

我正在尝试使用 boost 的功能来序列化指向原语的指针(这样我就不必取消引用并自己进行深度存储)。但是,当我尝试这样做时,会遇到一堆错误。这是一个简单的类示例,它应该包含 saveload 从文件中写入和读取类内容的方法。该程序无法编译:

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

#include <boost/serialization/shared_ptr.hpp>
#include <boost/shared_ptr.hpp>

#include <fstream>

class A

public:
    boost::shared_ptr<int> sp;
    int const * p;

    int const& get() return *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)
        
            ar & p & 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()



请注意,我对取消引用指针的解决方案感兴趣;我希望 boost 为我解决这个问题(其中许多类可能指向同一个底层对象)。

【问题讨论】:

你得到的错误是......? 【参考方案1】:

在http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html:

默认情况下,实现级别指定原语的数据类型 类序列化特征永远不会被跟踪。如果需要跟踪 通过指针共享的原始对象(例如,用作 引用计数),它应该被包装在一个类/结构中,以便它是 一个可识别的类型。改变实现的替代方案 long 的级别会影响整个程序中序列化的所有 long - 可能不是人们想要的。

因此:

struct Wrapped 
    int value;
    private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar,const unsigned int file_version)
    
        ar & value;
    
;

boost::shared_ptr<Wrapped> sp;
Wrapped const * p;

【讨论】:

这是一个非常有用的答案,但通过搜索需要很长时间才能找到。如果有人有兴趣使用 boost 来序列化类中的二进制数据,例如 unsigned char* 类型的成员,最好的选择是将这些数据包装到一个向量中。即 MyClass::vector binary_data。然后,您可以从 MyClass 中以 &binary_data[0] 的形式访问 c 数组,并且可以通过 boost 轻松序列化整个向量。 现在有了 boost 1.72,我们可以序列化原始类型的指针吗?

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

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

如何提升::序列化指针和引用?

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

在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

当我使用 ArrayList 时,如何防止 GWT 尝试包含每个可序列化的类

返回指向类中的类的指针