2009-11-06 6 views
2

보호 된 멤버로 클래스를 serialize하려고하면 다음 오류가 발생합니다. "NetElement 클래스에 선언 된 보호 된 멤버에 액세스 할 수 없습니다." 클래스 정의 밖에서 하나의 직렬화 함수를 갖고 싶습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?보호 된 데이터에 대한 순차 액세스를 향상

안부, 여기


코드가 mightydodol ... 다른 비 멤버 함수처럼

// 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

대답은 – dodol

답변

3

만 NetElement의 공용 멤버에 액세스 할 수 있습니다 직렬화 기능. 공용 인터페이스가 객체를 직렬화 할 충분한 상태를 노출하지 않는 경우 serialize 함수를 멤버로 만들어야합니다.

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

단점은 그이 사본을 serialising 전에 객체 : 당신이 NetElement에서 파생 된 "접근"클래스를 사용하여 얻을 수 있도록이 경우

는하지만, 국가는 보호됩니다.

+0

입니다.하지만 NetElement 클래스를 변경할 수없는 경우 어떻게해야합니까? 내 옵션은 무엇입니까? 죄송합니다, 충분히 명확하지 않았습니다 ... 고맙습니다. – dodol

5

"friend"줄을 추가하여 클래스를 변경 한 것을 이미 보여 줬습니다 (클래스 내부에 serialize 함수가 없으면 아무 일도하지 않습니다).

클래스를 변경할 수 없으면 더 취약한 솔루션이 붙어 있습니다 (여기에 한 번 해봐야 할 것은 자랑스럽지 않습니다.

#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); 
} 
관련 문제