序列化指针本身而不是目标对象

serialize pointer itself not the target object

本文关键字:目标对象 指针 序列化      更新时间:2023-10-16

我有一个数据类要保存并使用boost序列化器加载。

类包含两个成员En *sender, En *receiver到我的系统中已经创建的两个对象。我不需要它们再被创造出来。我只需要发送(序列化)他们的address,作为另一端的参考。

如果我使用普通指针,如En *sender, En *receiver, boost将序列化整个对象(这是我不想要的)。

所以我想我应该使用En **sender, En **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 ‘->’ ?)

似乎没有办法比手动存储地址,否则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;
    }
//...
};

以后使用指针时,我将简单地转换为适当的指针类型。