2011-08-29 3 views
2

boost가 기본 클래스에 대한 포인터를 통해 저장된 객체의 직렬화를 처리하는 방법을 이해하려고합니다. 특히 이렇게 만들어진 아카이브에서 후속 읽기가 어떻게 작동하는지. 여기에 (모든 헤더의 포함을 생략) 몇 가지 예제 코드는 다음과 같습니다기본 클래스에 대한 포인터를 통해 저장된 부스트 아카이브에서 객체를 읽는 작업은 어떻게됩니까?

class A 
{ 
    public: 
    A() {}; 
    ~A() {}; 
    virtual void dummy() {}; 
    private: 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) {}; 
}; 

class B : public A 
{ 
    public: 
    B() : x(0) {}; 
    B(int _x) : x(_x) {}; 
    ~B() {}; 
    void dummy() {}; 
    int x; 
    private: 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & boost::serialization::base_object<A>(*this); 
     ar & x; 
    } 
}; 

BOOST_CLASS_EXPORT(B) 
BOOST_CLASS_IMPLEMENTATION(B, boost::serialization::object_serializable) 
BOOST_CLASS_TRACKING(B, boost::serialization::track_never) 

int main(int argc, char *argv[]) 
{ 
    { //writing the archive 
    boost::filesystem::ofstream file("archive.dat", std::ios::trunc); 
    boost::archive::text_oarchive archive(file); 

    A* ptr = new B(3); 
    archive & ptr; 
    } 

    { // reading the archive 
    boost::filesystem::ifstream file("archive.dat"); 
    boost::archive::text_iarchive archive(file); 

    /** What is supposed to go here? */ 
    } 

    return 0; 
} 

나는

A* ptr; 
archive & ptr; 

어떻게 든 판독 섹션의 일을 할 것 같은 생각. 그러나 어떻게 작동합니까? 먼저 표준 생성자를 사용하여 힙에 B 유형의 객체를 만들고 (나중에 필요함), 내부 멤버의 값을 설정합니까?

다른 방법이 있습니까? 예를 들어, B 유형의 객체를 보관 파일에 B (기본 클래스 포인터를 통해 직렬화되었지만) 유형의 객체 만 포함하는 경우 객체를 직접 인스턴스화 할 수 있습니까?

답변

0

저는 이것이 포인터 유형에 대한 부분 템플릿 전문화 작업을 수행하고 있다고 생각합니다. 부스트의 어딘가에는 종류의 무언가이다 :

class text_oarchive { 
    template <class T> operator&(T); 
}; 

하고 전문화있다 :

template <class T*> 
text_oarchive<T*>::operator&(T *t) { 
    //serial the value as a pointer 
} 

당신은하지 않고 클래스를 만들어서는 힙에 B의 복사본을 만드는 것 있는지 확인하기 위해 테스트 할 수는 기본 생성자.

+0

아니요, 표준 생성자 없이는 작동하지 않습니다. 그것은'static void construct (T * t) {:: new (t) T; }'. http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#constructors에 따르면 "내부에서"생성자를 호출합니다. 이것은 무엇을 의미합니까? 기본 생성자없이 얻으려면 분명히 저장 /로드 루틴을 오버로드해야합니다. – janitor048

관련 문제