2

MFaceBOOSTの助けを借りてクラスをシリアライズしようとしましたが、

// 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::Vector と 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>
4

1 に答える 1

1

これは、ブーストのシリアル化を正しく覚えている場合です...

次のように、MFace 内の serialize メソッドに追加できます。

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 クラスのシリアル化に追加する必要があります。

さらに、boost がシリアル化する方法がわからない MFace クラスに何らかの種類の複雑なオブジェクトを追加する場合は、そのメンバーをメンバーごとにシリアル化する必要があります。

各オブジェクトのシリアル化は、それ自体をシリアル化する方法を知っている方がよいでしょう。シリアル化する方法の定義は、各クラスの serialize() メソッドに含まれている必要があります。

serialize メソッドを DG::MNode クラスに追加すると、この問題はなくなります。

于 2013-03-11T15:22:39.067 に答える