부스트 :: 직렬화를 사용하여이 클래스를 직렬화/역 직렬화 하시겠습니까?포인터 및 기본이 아닌 생성자를 사용하여 직렬화 부스트
#include <vector>
struct Foo {
struct Bar {
std::vector<int> * data; // Must point to Foo::data
Bar(std::vector<int> * d) : data(d) { }
};
std::vector<int> data;
std::vector<Bar> elements;
Foo() {
// do very time consuming calculation to populate "data" and "elements"
}
};
푸의 생성자는 직렬화 된 데이터에서로드 반대 때 실행하지만, 객체 인 경우 기본 생성자가 평가되어야 구축 할 수 없습니다.
Bar에 기본 생성자를 추가해도 괜찮지 만 직렬화 후에 Foo :: Bar :: data는 Foo :: data를 가리켜 야합니다.
편집 : 다음은 내 시도
의 비 작업 구현이 @Matthieu에서 힌트를 기반으로 내 시도이다. 문제는 Foo를 deserialize 할 때 Foo :: data와 Foo :: 요소에 요소가 없다는 것입니다.
struct Foo {
struct Bar {
std::vector<int> * data;
Bar() : data(0) { }
Bar(std::vector<int> * d) : data(d) { }
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & data;
}
};
std::vector<int> data;
std::vector<Bar> elements;
Foo() {
std::cerr << "Running default constructor" << std::endl;
data.push_back(1);
data.push_back(2);
data.push_back(3);
data.push_back(4);
data.push_back(5);
elements.push_back(Bar(&data));
elements.push_back(Bar(&data));
elements.push_back(Bar(&data));
}
template<class Archive>
Foo(Archive & ar) {
ar >> data; // is this corrent?
ar >> elements;
}
private:
BOOST_SERIALIZATION_SPLIT_MEMBER();
friend class boost::serialization::access;
template<class Archive>
void save(Archive & ar, const unsigned int version) const {
const std::vector<int> * data_ptr = &data;
// should data be seriliazed as pointer...
// it is used as a pointer in Bar
ar << data_ptr;
ar << elements;
}
};
int main(int argc, const char *argv[])
{
#if 0
// serialize
Foo foo;
boost::archive::text_oarchive oar(std::cout);
oar << foo;
#else
// deserialize
boost::archive::text_iarchive oar(std::cin);
Foo foo(oar);
#endif
std::cerr << foo.data.size() << std::endl;
std::cerr << foo.elements.size() << std::endl;
std::cerr << (&foo.data) << std::endl;
for(const auto& a : foo.data)
std::cerr << a << " ";
std::cerr << std::endl;
for(const auto& a : foo.elements)
std::cerr << a.data << " ";
std::cerr << std::endl;
return 0;
}
네, 본 적이 있습니다. 하지만로드 오버로드를 어떻게 작성 하시겠습니까? Foo의 기본 생성자는 호출되어서는 안됩니다. – Allan
@Allan : 비 직렬화를위한 생성자를 추가해야합니다. 예를 들어 인수에서 부스트 아카이브를 사용하는 생성자. –
@Matthieu Ahh .. 이것처럼 간단합니다, 고마워요. Foo :: data는 포인터로 직렬화해야하며 직렬화 해제 할 때 스왑을 수행해야합니까? – Allan