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

Posted

技术标签:

【中文标题】序列化指针本身而不是目标对象【英文标题】:serialize pointer itself not the target object 【发布时间】:2013-03-13 06:16:31 【问题描述】:

我有一个要使用 boost 序列化程序保存和加载的数据类。

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

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

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

【问题讨论】:

什么是“另一端”?指针仅在您的程序中有效。 嗨,是的,另一端是我的程序。(故事:我使用序列化在我们的模拟器中的代理之间发送/接收数据。这个发送/接收必须遵循无线网络不确定性的模型,例如延迟, 丢失等. 所以我序列化数据包将发送者接收者信息放入数据包中, 然后通过写入文件[发送文件]将数据包发送到另一个模拟器. 第二个模拟器读取这个文件并且不关心的内容数据包。它只是在延迟后将内容写入另一个文件[接收文件](或者根本不发送它以类似于“丢失”)。第一个模拟器读取.... 读取接收文件,反序列化并根据接收者的信息,将信息传递到接收者的传入缓冲区)。在这里,我只需要接收者信息就是接收对象的地址......其余的很清楚(我认为) 如果所有这些都发生在同一个程序/进程中,为什么要序列化任何东西?您可以只传递一个指向***数据结构的指针。无论如何,您可以将指针转换为正确大小的整数类型并将其序列化,并在反序列化时向另一个方向转换。我认为您将需要单独的序列化和反序列化方法,本教程有一个如何做到这一点的示例。 @n.m.是的,我认为转换为整数类型是唯一的方法。谢谢。而且,根据教程,我还分离了发送和接收。最后是关于“传递指向***数据结构的指针”......我没有使用堆。如果你问为什么,我不会回答。只是不想动态创建数据对象并在那之后清理它们。因此数据在本地生成并以与说明相同的方式恢复。 【参考方案1】:

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

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

【讨论】:

以上是关于序列化指针本身而不是目标对象的主要内容,如果未能解决你的问题,请参考以下文章

对象是不是以序列化形式有效? c++/继承/序列化

让springboot序列化空值null为"null"而不是空报文体(jackson)

序列化程序返回对象而不是字段

使用 Parcelable 而不是序列化对象的好处

使用可序列化而不是向/从文件写入和读取对象

.net XML 序列化 - 存储引用而不是对象副本