2010-11-18 6 views
0

기본 클래스와 4 개의 파생 클래스가 있습니다. 모든 파생 클래스를 기본 클래스 포인터 유형의 벡터에 저장합니다. 처음 초기화 할 때 생성자를 사용하여 파생 된 각 유형을 다르게 만듭니다. 기본적으로 각각의 매개 변수에는 서로 다른 매개 변수 유형이 있습니다. (나는 BOOST_CLASS_EXPORT 컴파일을하기 위해 보호 된 디폴트 ctor를 제공해야했지만 그것은 다른 이야기이다). 나는이 파생 된 클래스의 모든 멤버 (ctor로 채워짐)를 저장하거나 저장할 수 없다.boost :: serialization 다형 유형 초기화

이제 boost :: serialize를 사용하여 디스크에서 객체를로드하면 직렬화되지 않고 파생 된 각 유형에 고유 한 멤버가 삭제됩니다. 그리고 나는 기본 클래스 포인터 만 저장하기 때문에 이러한 파생 된 유형을 다시 초기화하는 방법을 생각할 수 없습니다. 나는 모든 콘텐츠를 삭제하지 않고, 부분적으로 내 파생 된 형식 (포인터)를로드 할 수있게되고 필요가 정확히 무엇

..

는이를 극복 할 수있는 방법은 마법 증 정의 혹은 함수 호출 있나요? 그렇지 않으면 boost :: serialize와 함께 다형성이 전혀 불가능합니다. 뭔가 빠져 있어야하고 내 문제를 충분히 정의 할 수 있기를 바랍니다.

답변

0

직렬화를 위해서만 기본 생성자를 만들 필요는 없습니다. 대신에 기본 생성자가 아닌 데이터를 저장 /로드하고,로드 할 때 새로운 오브젝트를 생성하는 데 사용할 수 있습니다.

그런 식으로 직렬화 중에 데이터 멤버의 유효성을 보장하기 위해 생성자가 어떤 작업을 수행하든 관계없이 직렬화 라이브러리는 개체의 데이터 멤버를 직접 조작 할 필요가 없습니다. 이렇게하면 데이터 삭제가 방지됩니다. 클래스가 namesize 사용하여 구성 할 수있는 경우는 다음과 같이

예를 들어, 함수를 오버로드 수 :

template <class Archive> 
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int) { 
    ar << my_class->name(); 
    ar << my_class->size(); 
} 

template<class Archive> 
inline void load_construct_data(Archive & ar, my_class * t, const unsigned int) { 
    std::string name; 
    int size; 
    ar >> name; 
    ar >> size; 
    ::new(t)my_class(name, size); // placement 'new' using your regular constructor 
} 

체크 아웃 문서 here합니다.