0

ブーストシリアライザーを使用して保存およびロードするデータクラスがあります。

クラスには、システムで既に作成されている 2 つのオブジェクトへの 2つのメンバーEn *senderが含まれています。En *receiverそれらを再度作成する必要はありません。addressもう一方の端で参照として使用されるように、それらを送信(シリアル化)する必要があります。

, のような通常のポインターを使用する En *senderEn *receiver、ブーストはオブジェクト全体をシリアル化します (これは望ましくありません)。

したがってEn **senderEn **receiver エラーを生成する を使用する必要があると考えました。目的に合わせてクラスを変更する方法を教えてください。

どうもありがとう。

class dataMessage
{

    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &ar, const unsigned int version)
    {            
        ar & sender;
        ar & receiver;
    }
    //I figured I should user pointer to pointer coz in case of the normal pointer,
    //the serilizer would serializes the object that the pointer is pointing to;
    //whereas I just need to save the 'pointer' to object so that we
    //can use it as a reference at the other end.
    En **sender;
    En **receiver;
public:
    dataMessage(){
        sender = receiver = 0;
    }
    void setDataClassType();
    virtual void registerType(boost::archive::text_oarchive &oa)
    {
        oa.register_type(static_cast<dataMessage *>(NULL));
    }

    virtual void registerType(boost::archive::text_iarchive &ia)
    {
        ia.register_type(static_cast<dataMessage *>(NULL));
    }
};

エラーの一部:

error: request for member ‘serialize’ in ‘t’, which is of pointer type ‘En*’ (maybe you meant to use ‘->’ ?)
4

1 に答える 1

0

アドレスを手動で保存する以外に方法はないようです。そうしないと、boostserializer がターゲット オブジェクトをシリアル化します。そのため、送信者の受信者のタイプを次のように変更しました。

class dataMessage
{

 //......
public:
//.....
    //a proper size of integer is used coz in case of the normal pointer,
    //the serilizer serializes the object that the pointer is pointing to
    //whereas we just need to save the 'pointer' to object so that we
    //can use it as a reference at the other end. so instead of storing 'sim_mob::Entity *'
    //we store:
#if __x86_64__  //64 bit
    unsigned long sender;
    unsigned long receiver;
#else          //32 bit
    unsigned int sender;
    unsigned int receiver;

#endif


    dataMessage(){
        sender = receiver = 0;
    }
//...
};

後でポインターを使用するときに、適切なポインター型への単純なキャストを行います。

于 2013-03-13T10:15:30.713 に答える