2014-12-05 153 views
0

我試圖使用Boost庫來序列化(保存)和反序列化(重新加載)對象,以便儘量減少對開銷內存的需求,因爲我創建了多個對象。我是Boost庫的新手,但到目前爲止,我不想修改我正在使用的庫。我試着寫下面的代碼,但是我得到了一個錯誤{error C2039:'serialize':不是'DirectedGraphicalModels :: CGraph'E:\ external \ boost \ boost_1_54_0 \ boost \ serialization \ access.hpp 118}的成員。我使用的是圖形庫的頭是here使用循環對圖進行序列化和反序列化

int main(int argc, char *argv[]) 
{ 
CImageGraph *pGraph  = new CGraph(nStates); 
cout << "Building the Graph..." << endl; 
pGraph->buildImageGraphN4(fv.rows, fv.cols, pEdgeTrainer != NULL, true); 

// Save data 
    { 
    const char* fileName = "Graph.txt"; 
    // Create an output archive 
    std::ofstream ofs(fileName); 
    boost::archive::text_oarchive ar(ofs); 
    // Save only the pointer. This will trigger serialization 
    // of the object it points too, i.e., o1. 
    ar & pGraph; 
    } 

    // Restore data 
    CImageGraph *pRGraph  = new CGraph(nStates); 
    cout << "Building the Graph for restore..." << endl; 
    pRGraph->buildImageGraphN4(fv.rows, fv.cols, pEdgeTrainer != NULL, true); 
    pRGraph; 
    { 
    const char* fileName = "Graph.txt"; 
    // Create and input archive 
    std::ifstream ifs(fileName); 
    boost::archive::text_iarchive ar(ifs); 
    // Load 
    ar & pRGraph; 
    } 

    // Make sure we read exactly what we saved. 
    assert(pRGraph != pRGraph); 
    //assert(*pRGraph == pRGraph); 

} 

請諮詢我如何,我可以繼續保存和重新加載,以便進一步處理圖形。到目前爲止,我已經參考了這篇文章12,但我還沒有清楚地理解這些概念。 在此先感謝。

回答

0

您需要實現序列化功能。眼看你不想修改庫頭,加上幫手像這樣:

#include <boost/serialization/vector.hpp> 

namespace boost { namespace serialization { 

     template <typename Ar> 
     void serialize(Ar& ar, DirectGraphicalModels::CGraph& graph, const unsigned int version) { 
      //// e.g.: 
      // ar & graph.title(); 
      // ar & graph.nodes(); // will use the default vector adaptation from the header above 
      // ar & graph.edges(); // will use the default vector adaptation from the header above 
     } 

     template <typename Ar> 
     void serialize(Ar& ar, DirectGraphicalModels::Node& node, const unsigned int version) { 
      //// e.g.: 
      // ar & node.source; 
      // ar & node.target; 
     } 

     // etc. 

} } 

默認對象跟蹤的所有對象進行的(de)通過指針序列化。這可以確保別名指針不會(兩次)序列化,這意味着您可以很好地(循環)序列化循環圖。

+0

我試着執行您的代碼和我得到這個錯誤「34智能感知:命名空間定義是不允許的main.cpp \t 207」可能是什麼問題呢? ? 「 – Benson 2014-12-05 16:36:33

+0

或者您將代碼發佈到了錯誤的位置(在類或函數內?),或者您只需忽略IntelliSense並監視_compiler errors_而不是**。**注意**我編寫了諸如title( )','source','target',我會再次發表評論以使其更清晰 – sehe 2014-12-06 01:43:38

+0

我試過了,仍然有相同的錯誤,沒有編譯成功,是否意味着我必須將它創建爲類? ,我在主內部直接使用它 – Benson 2014-12-06 14:32:29

相關問題