使用共享指针和模板促进序列化

Posted

技术标签:

【中文标题】使用共享指针和模板促进序列化【英文标题】:Boost serilaization with shared pointer and templates 【发布时间】:2014-03-05 09:05:32 【问题描述】:

我是 C++ 新手,如何序列化具有共享指针和模板的结构。 下面是示例代码。

#pragma once

#include <boost/serialization/access.hpp>
#include <boost\serialization\string.hpp>
#include <boost\serialization\shared_ptr.hpp>

//Mydata.hpp file

namespace mydata


struct MyData

    std::string name;
    std::string type;
    std::shared_ptr<MyInfo> myref;

    private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &ar, const unsigned int vs)
    
        ar & name;
        ar & type;
        ar & myref;
    


现在如何在对应的 Mydata.cpp 文件中实现共享指针?

【问题讨论】:

【参考方案1】:

该标头包含对boost::shared_ptr 的支持,因此可以使用以下方法:

#include <boost/serialization/access.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/smart_ptr/make_shared.hpp>

namespace mydata

    struct MyInfo 
    
        std::string info = "extra info";

        MyInfo(std::string info) : info(std::move(info)) 

        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive &ar, const unsigned int /*version*/)
            
                ar & info;
            
    ;

    struct MyData
    
        std::string name;
        std::string type;
        boost::shared_ptr<MyInfo> myref;

        private:
        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive &ar, const unsigned int /*version*/)
            
                ar & name;
                ar & type;
                ar & myref;
            
    ;


int main()


    using namespace mydata;
    MyData data  "this is a name", "this is a type", boost::make_shared<MyInfo>("this is info") ;

    boost::archive::text_oarchive oa(std::cout);
    oa << data;

Live On Coliru

【讨论】:

以上代码是否需要在 Mydata.cpp 文件中实现 Template definitions always go into headers。否则,这是你的选择。如果您不想要序列化逻辑,您可以查看non-intrusive serialization adaption,它不需要您将成员添加到现有(公共或第三方)类

以上是关于使用共享指针和模板促进序列化的主要内容,如果未能解决你的问题,请参考以下文章

促进不透明类型的序列化

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

Google 协议缓冲区和 stl 向量、映射和提升共享指针

luogu P6086 模板Prufer 序列

算法学习——双指针算法(最长连续不重复子序列)

序列化包含指针向量的struct,每个指针包含其他指针