2011-02-08 3 views
2

부스트 :: 직렬화 라이브러리에서 참조 및 기본 생성자가없는 객체를 비 직렬화 (다형성) 할 수 있습니까?참조 및 기본 생성자가없는 객체 역 직렬화 (부스트 :: 직렬화)

class Example 
{ 
    int& value; 

public: 

    Example(int _value): value(_value) {} 
    virtual ~Example() {} 

    friend class boost::serialization::access; 
    template<typename Archive> 
    void serialize(Archive & ar, const unsigned int file_version) 
    { 
     ar & value; 
    } 
}; 

class Usage 
{ 
    Example* example; 

public: 

    Usage(): example(new Example(123)) {} 
    ~Usage() { delete example; } 

    friend class boost::serialization::access; 
    template<typename Archive> 
    void serialize(Archive & ar, const unsigned int file_version) 
    { 
     ar & example; 
    } 
}; 

... 비 기본 작도 객체로

// serialize and deserialize object with reference and no default constructor 
{ 
    Usage source; 

    std::ostringstream oss; 
    boost::archive::text_oarchive oa(oss); 
    oa & source; 

    Usage target; 

    std::istringstream iss(oss.str()); 
    boost::archive::text_iarchive ia(iss); 
    ia & target; // does not compile 
} 

답변

5

, 나는 아이템을 기본이 아닌 생성자 here을 볼 것을 권 해드립니다.
클래스는 함수 템플릿 load_construct_datasave_construct_data을 작성하여 일련 번호를 지정할 수 있습니다.

+1

오른쪽 기능에도 불구하고 매우 성가신 비대칭이 있습니다. 즉,'load_construct_data'와'save_construct_data'를 사용하면, 아카이브에 /로부터 데이터의 일부를 가져 오거나 가져올 것이고, 그 함수는'serialize()'를 호출합니다.이 함수는 더 많은 데이터를 저장/가져올 수 있습니다 아카이브. 그러나 포인터를 사용하지 않고 객체를 직렬화하려고하면'save/load_construct_data'를 호출하지 않기 때문에'serialize()'만 사용하여 모든 데이터를 넣거나 가져 오지 않습니다. 무슨 뜻인지 알 겠어? –

+0

@DavidDoria : 'serialize'가'load_construct_data' 내부에서 호출된다는 것을 의미합니까? 올바르게 이해하면,'load_construct_data'가 완료되면'serialize'가 호출됩니다. 이 끝났습니다. 'load_construct_data'는 클래스 (답변에 링크 된 문서의'm_attribute'), 및 문서의'm_state'를 제외한'serialize' 클래스를로드하는 데 필요한 데이터 만로드합니다. –

+1

예, 그것이 내 뜻입니다. 문제는 직렬화가 포인터 유형에서만 작동한다는 것입니다. 즉, 우리가 테스트 테스트를한다면; outArchive << 테스트에서는 save_construct_data가 아니라 serialize() 만 호출됩니다. 그런 다음 포인터 형식을 사용하여 역 직렬화 (Test * readTest; inArchive >> readTest;)를 수행해야하므로 작동하지 않습니다. –