使用共享指针和模板促进序列化
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++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法