2014-03-05 43 views
1

我是C++的新手,我如何序列化具有共享指針和模板的結構。 以下是示例代碼。使用共享指針和模板的boost系列化

#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文件中實現共享指針?

回答

0

這頭包括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

+0

上面的代碼做我需要實現它Mydata.cpp文件 – sia

+0

[模板定義總是走到標題](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file/495056#495056)。否則,這是你的選擇。如果你不想在那裏使用序列化邏輯,你可以看看[non-intrusive serialization adaption](http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/tutorial.html# nonintrusiveversion),它不需要你添加成員到現有的(公共或第三方)類 – sehe