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
}
오른쪽 기능에도 불구하고 매우 성가신 비대칭이 있습니다. 즉,'load_construct_data'와'save_construct_data'를 사용하면, 아카이브에 /로부터 데이터의 일부를 가져 오거나 가져올 것이고, 그 함수는'serialize()'를 호출합니다.이 함수는 더 많은 데이터를 저장/가져올 수 있습니다 아카이브. 그러나 포인터를 사용하지 않고 객체를 직렬화하려고하면'save/load_construct_data'를 호출하지 않기 때문에'serialize()'만 사용하여 모든 데이터를 넣거나 가져 오지 않습니다. 무슨 뜻인지 알 겠어? –
@DavidDoria : 'serialize'가'load_construct_data' 내부에서 호출된다는 것을 의미합니까? 올바르게 이해하면,'load_construct_data'가 완료되면'serialize'가 호출됩니다. 이 끝났습니다. 'load_construct_data'는 클래스 (답변에 링크 된 문서의'm_attribute'), 및 문서의'm_state'를 제외한'serialize' 클래스를로드하는 데 필요한 데이터 만로드합니다. –
예, 그것이 내 뜻입니다. 문제는 직렬화가 포인터 유형에서만 작동한다는 것입니다. 즉, 우리가 테스트 테스트를한다면; outArchive << 테스트에서는 save_construct_data가 아니라 serialize() 만 호출됩니다. 그런 다음 포인터 형식을 사용하여 역 직렬화 (Test * readTest; inArchive >> readTest;)를 수행해야하므로 작동하지 않습니다. –