Làm thế nào bạn sẽ tuần tự hóa/deserialize lớp này bằng cách sử dụng boost :: serialization?Tăng tuần tự hóa với con trỏ và hàm tạo mặc định
#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"
}
};
Hàm khởi tạo trong Foo không được thực thi khi đối tượng được tải từ dữ liệu tuần tự, nhưng nếu đối tượng được xây dựng mặc định thì hàm tạo phải được đánh giá.
Bạn có thể thêm một hàm tạo mặc định vào Bar, nhưng sau khi tuần tự hóa dữ liệu Foo :: Bar :: phải trỏ đến dữ liệu Foo ::.
EDIT: Sau đây là một việc thực hiện không làm việc cố gắng của tôi
Đây là nỗ lực của tôi dựa trên các gợi ý từ @Matthieu. Vấn đề là khi tôi deserialize Foo, tôi nhận được không có yếu tố trong Foo :: dữ liệu và Foo :: yếu tố.
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;
}
Có, tôi đã thấy điều này. Nhưng làm thế nào bạn sẽ viết quá tải tải? Hàm khởi tạo mặc định của Foo không được gọi. – Allan
@Allan: bạn sẽ cần phải thêm một hàm tạo cụ thể cho việc deserialization. Ví dụ: một hàm tạo cần lưu trữ tăng trong đối số. –
@Matthieu Ahh .. đơn giản như thế này, cảm ơn. Điều gì về Foo :: dữ liệu, tôi nên serialize nó như là một con trỏ, và sau đó làm một trao đổi khi deserializing? – Allan