2013-03-11 51 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