2013-04-18 54 views
2

升壓系列化能夠與升壓序列化,但無法反序列化的std :: shared_ptr的

namespace boost { 

    namespace serialization { 

    template <class Archive, class T> 
    inline void save 
     (Archive &archive, 
     const std::shared_ptr<T> subtree, 
     const unsigned int file_version) 
    { 
     // only the raw pointer has to be saved 
     const T *const subtree_x = subtree.get(); 

     archive << subtree_x; 
    } 

    template <class Archive, class T> 
    inline void load 
     (Archive &archive, 
     std::shared_ptr<T> subtree, 
     const unsigned int file_version) 
    { 

     T *p_subtree; 

     archive >> p_subtree; 

     #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) 
      subtree.release(); 
      subtree = std::shared_ptr<T>(p_subtree); 
     #else 
      subtree.reset(p_subtree); 
     #endif 
    } 

    template <class Archive, class T> 
    inline void serialize 
     (Archive &archive, 
     std::shared_ptr<T> subtree, // no const or else get compile-time error 
     const unsigned int file_version) 
    { 
     boost::serialization::split_free(archive, subtree, file_version); 
    } 

    } // namespace serialization 
} // namespace boost 

樹類

class Tree{ 

private: 

class TreeNode{ 

public: 


    std::shared_ptr<TreeNode> node_factory(const T &new_key, const long &new_index) 
    { 
     return std::shared_ptr<TreeNode>(new TreeNode(new_key, new_index)); 
    } 

    friend class Tree; 

private: 

    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive &archive, const unsigned int /* file_version */){ 
     archive & key; 
     archive & index; 
     archive & left; 
     archive & right; 
    } 

    T key; 
    long index; 

    std::shared_ptr<TreeNode> left; 
    std::shared_ptr<TreeNode> right; 

}; // End Tree Node Class Definition 

friend class boost::serialization::access; 
template <class Archive> 
void serialize(Archive &archive, const unsigned int version){ 
    archive & root; 
} 
}; 

作家

bool save(std::shared_ptr<Tree> &tree, const std::string &search_tree_file_name) 
{ 
    // create and open a binary archive for output 
    std::ofstream writer(search_tree_file_name, std::ofstream::out | std::ofstream::binary); 

    if(writer){ 
     boost::archive::binary_oarchive serial_writer(writer); 
     //set_flags(0, true); 
     // write class instance to archive 
     serial_writer << *tree; 
     // archive and stream closed when destructors are called 

    }else if(writer.fail()){ 
     writer.clear(); 
    } 
    return true; 
} 

讀者

enter code here bool load(std::shared_ptr<Tree> &tree, const std::string &search_tree_file_name) 
{ 
    // create and open a binary archive for output 
    std::ifstream reader(search_tree_file_name, std::ifstream::in | std::ifstream::binary); 

    if(reader){ 
     boost::archive::binary_iarchive serial_reader(reader); 
     // read class state from archive 
     serial_reader >> *tree; 
     // archive and stream closed when destructors are called 

    }else if(reader.fail()){ 
     reader.clear(); 
    } 

    return true; 
} 

我已經寫入並驗證了對文件的成功序列化,但未能從可用對象反序列化並進入可用對象。

無論我是以文本還是二進制編寫,我都可以驗證序列化輸出是否正確,但出於某種原因,序列化輸出並未反序列化,加載時我留下了空對象。

+0

我建議不要爲所有共享指針定義加載/保存,而是對'std :: shared_ptr '執行此操作。 –

+0

你收到了什麼錯誤? –

+0

@ n.m。沒有得到錯誤。只是看不到反序列化的數據。一旦'serial_reader >> * tree;'完成,樹就像它作爲參數傳入一樣。 – Mushy

回答

1
+0

我讀過你的鏈接,並對載入,保存和序列化聲明進行了更改,但執行了以下操作:刪除了名稱空間boost和序列化聲明,現在使用'boost :: shared_ptr'而不是'std :: shared_ptr'。序列化問題現在已解決。 – Mushy

+1

這真的很酷:) – Arun

0

雖然@Arun爲利用std::shared_ptr提供了極大的文檔參考有用的,我卻選擇採用boost::shared_ptr與升壓::系列化,它已經治好了我的反序列化的問題。