2010-12-13 3 views
9

일관성있는 예제와 응답을 읽고 상호 참조하고 궁극적으로 찾지 못했습니다. 내가하려고하는 일은 꽤 간단하지만, 나는 분명히 뭔가를 놓치고있다. 내가이 벡터를 포함하는 다른 객체를 직렬화하고 싶습니다부울 직렬화 예외 : 등록되지 않은 클래스, 다형성 기본 문제 직렬화

std::vector<AA*> 

: 영어로, 나는이 같은 관리 두 추상베이스 (순수 BB 순수 AA에서 파생)와 클래스 구조를 가지고있다. 제외한 모든 이 벡터 잘 직렬화하지만,이 벡터에 도달하면, 그것은 예외 :

terminate called after throwing an instance of 'boost::archive::archive_exception' 
    what(): unregistered class - derived class not registered or exported 

내가 명시 적 기본 추상적 인 선언, 명시 적으로 직렬화하기 전에 부모 유형을 등록 포함한 몇 가지를 시도했습니다 클래스 'BOOST_SERIALIZATION_ASSUME_ABSTRACT'등과 같은 그러나, 나는 런타임에 예외와 함께 떠났어.

저는이 예제 (및 솔루션)를 레코드에 제공하여 다른 사람들이이 불량한 것을 약간 불투명 한 라이브러리로 사용할 수 있도록하고 싶습니다. 일단이 예제가 정사각형이라면 FAQ 나 문서에 적합하도록 부스트 직렬화 관리자에게 제출할 것입니다.

/* 
    g++ -Iinclude/ -Llib -lboost_serialization ~/Desktop/ser_ex.cpp -o stest 
*/ 
#include <boost/serialization/serialization.hpp> 
#include <boost/serialization/nvp.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/serialization/vector.hpp> 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

namespace bser = boost::serialization; 
class AA 
{ 
public: 
    virtual void foo() = 0; 
    std::string name; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar & bser::make_nvp("Name", name); 
    } 
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(AA); 

class BB : public AA 
{ 
public: 
    virtual void foo() = 0; 
    virtual void bar() = 0; 
    int thing; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar.template register_type<AA>(); 
     ar & bser::base_object<AA>(*this); 
     ar & bser::make_nvp("Thing", thing); 
    } 
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(BB); 

class CC : public BB 
{ 
public: 
    virtual void foo() {} 
    virtual void bar() {} 
    int otherThing; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar.template register_type<BB>(); 
     ar & bser::base_object<BB>(*this); 
     ar & bser::make_nvp("OtherThing", otherThing); 
    } 
}; 

int main (int argc, char const *argv[]) 
{ 
    const std::string filename("my.serialized"); 
    const std::string key("AAVector"); 

    std::vector< AA* > vv; 
    vv.push_back(new CC); 

    std::ofstream outfilestream(filename.c_str(), std::ios::binary); 
    boost::archive::xml_oarchive out_archive(outfilestream); 
    out_archive << boost::serialization::make_nvp(key.c_str(), vv); 
    outfilestream.close(); 
} 

답변

6

나는 이것이 약간의 수정 작업을 가지고 :

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(AA); 
  • 교체 :

    • BB::serializear & bser::base_object<AA>(*this);를 교체

      아래의 예제 코드는 문제를 재현하는 ar & bser::base_object<BB>(*this); in,함께 :

      ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BB); 
      
    • BOOST_CLASS_EXPORT(CC)CC 후 정의를 추가합니다. 자세한 내용은 this documentation section을 참조하십시오.