2013-03-11 50 views
2

我試圖序列一類MFace與BOOST的幫助下,在類boost序列化類

// class of the face 
class MFace 
{ 
    public: 
     //constructor 
     MFace(); 
    private: 

    //! Vector of the face nodes 
     mymath::Vector<DG::MNode*> Nodes; 

     friend class boost::serialization::access; 
     template<class Archive> 
      void serialize(Archive & ar, const unsigned int version){ 
       //! Vector of the face nodes 
       ar & Nodes; 
      } 
}; 

但類包含另一個類

mymath::Vector<MNode*> Nodes; 

所以,當我嘗試寫Nodes到歸檔

//create a face 
MFace Face; 

//archive output file 
std::ofstream ofs("output.txt"); 
boost::archive::text_oarchive ar(ofs); 
// Write data to archive 
ar & Face; 
    ... 

編譯器給我一個錯誤

error: ‘class mymath::Vector<DG::MNode*>’ has no member named ‘serialize’ 

我應該再加一條「連載」到MFACE使用每個類(格外MYMATH ::向量,MNodes),並說明它務必做好,或者是它在某種程度上可以內MFACE不接觸其他解決問題班?

的包括有

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
//contains mymath::Vector<> 
#include "mymath/vector.h" 

//containes MNodes 
#include "MNode.h" 
#include <fstream> 

回答

1

這是如果我正確地記得我的升壓系列化...

,你可以添加到序列化方法MFACE內,像這樣:

void serialize(Archive & ar, const unsigned int version){ 
//of the face nodes 
    for(<loop to travel through each node in the Nodes vector>) 
    { 
     ar & currentNode.var1; 
     ar & currentNode.var2; 
     ar & currentNode.var3; 
    } 
} 

這是假定Node對象內部的每個成員都是boost庫可以序列化的類型。

但是,這個問題的原因是您完全將MFace類耦合到MNode類型 - 也就是說,如果將成員添加到MNode,則必須記住將其添加到MFace類的序列化中。此外,如果您向MFace類中添加任何類型的複雜對象,而這些對象不知道如何序列化,則必須按成員序列化該成員。

對每個對象進行序列化以知道如何序列化它自己更好 - 每個類的serialize()方法應該包含如何序列化的定義。

如果將序列化方法添加到DG :: MNode類,則此問題應該消失。

+0

因此,MFace中的MNodes的分解實際上起作用。感謝這個想法。 – user2157125 2013-03-11 15:58:23

+0

沒問題 - 只要記住當你使用分解時,如果有任何MNode改變的機會,或者MFace也會顯着改變,那麼從長遠來看,它會使你的生活變得更加困難。 – Silas 2013-03-11 16:21:15