2013-03-13 2 views
0

У меня есть класс данных, который нужно сохранить и загрузить с помощью бустера serializer.Сериализовать указатель сам не целевой объект

В класс входят два члена 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 ‘->’ ?) 
+0

Что такое «другой конец»? Указатель действителен только в вашей программе. –

+0

Привет, да, другой конец - это моя программа. (Рассказ: Я использую сериализацию для отправки/получения данных между агентами в нашем симуляторе. Эта передача/получение должна следовать моделях неопределенности беспроводной сети, таких как задержка, потеря и т. Д. Поэтому я сериализую пакеты отправляют информацию получателя отправителя в пакет, затем отправляют пакеты на другой симулятор, записывая файл [отправить файл]. Второй симулятор читает этот файл и не заботится о содержимом пакета. Он просто записывает содержимое в другой файл [получить файл] после задержки (или не отправить его вообще, чтобы походить на «потерю»). Первый симулятор читает .... – rahman

+0

считывает файл приема, десериализует и, согласно информации получателя, доставляет информацию на входящий буфер приемника). Здесь мне просто нужна информация о получателе, чтобы быть только адресом получающего объекта ... остальное понятно (я думаю) – rahman

ответ

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; 
    } 
//... 
}; 

позже, когда с помощью указателя, я сделаю простое приведение к соответствующему типу указателя.