2009-11-06 8 views
2

Lorsque j'essaie de sérialiser une classe avec des membres protégés, j'obtiens les erreurs suivantes: "Impossible d'accéder au membre protégé déclaré dans la classe NetElement". L'idée est que j'aimerais avoir une fonction de sérialisation en dehors de la définition de classe. Qu'est-ce que je fais mal?Accélération de l'accès de sérialisation aux données protégées

meilleures salutations, mightydodol


Voici le code ...

// class definition 
class NetElement 
{ 
    friend class boost::serialization::access; 
protected: 
    int nelements; 
    int ids; 
public: 
    static NetElement* New(){return new NetElement;} 
    virtual void Delete(){delete this;} 
protected: 
    NetElement(){}; 
    ~NetElement(){}; 
}; 
// nonintrusive serialize 
template<class Archive> 
void serialize(Archive & ar, NetElement& element, const unsigned int version=1) 
{ 
    ar & element.nelements & element.ids; 
} 

int main(void) 
{... 
    std::ofstream os("Pipe1.txt"); 
    boost::archive::text_oarchive oa(os); 
    serialize(oa,el/*ref to NetElementObj*/); 
... 
} 
+0

merci pour les réponses – dodol

Répondre

3

Comme toute autre fonction non-membre, votre fonction serialize ne peut accéder aux membres du public de NetElement. Si, comme c'est souvent le cas, l'interface publique n'expose pas assez d'état pour sérialiser l'objet, alors vous devrez faire de la fonction sérialiser un membre.

Dans ce cas, cependant, l'état est protégé, de sorte que vous pourriez obtenir à l'aide d'un « accesseur » classe dérivée de NetElement:

class NetElementAccessor : private NetElement 
{ 
public: 
    explicit NetElementAccessor(const NetElement &e) : NetElement(e) {} 

    using NetElement::nelements; 
    using NetElement::ids; 
}; 

template<class Archive> 
void serialize(Archive & ar, NetElement& element, const unsigned int version=1) 
{ 
    NetElementAccessor accessor(element); 
    ar & accessor.nelements & accessor.ids; 
} 

L'inconvénient est que cette copie l'objet avant de sérialisation il.

+0

ok, mais que faire si la classe NetElement ne peut pas être modifiée? Quelles sont mes options? Désolé, n'était pas assez clair ... Merci pour la réponse rapide si ... – dodol

5

Vous vous montrez déjà en train de changer la classe en ajoutant la ligne "friend" (qui ne fait rien pour vous sans que la fonction serialize ne soit dans la classe).

Sans pouvoir changer de classe, vous êtes confronté à des solutions plus fragiles (en voici une que je devais faire une fois, dont je ne suis pas fier (mais qui montre tout le point de protégé sur privé))

#include <boost/archive/text_oarchive.hpp> 
#include <fstream> 

// class definition 
class NetElement 
{ 
protected: 
    int nelements; 
    int ids; 
public: 
    static NetElement* New(){return new NetElement;} 
    virtual void Delete(){delete this;} 
protected: 
    NetElement(){}; 
    ~NetElement(){}; 
}; 

class NetElementS : public NetElement 
{ 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & nelements & ids; 
    } 
}; 

int main(void) 
{ 
    NetElement *el = NetElement::New(); 
    std::ofstream os("Pipe1.txt"); 
    boost::archive::text_oarchive oa(os); 
    oa & *reinterpret_cast<NetElementS *>(el); 
} 
Questions connexes