如何使用boost :: serialization序列化/反序列化此类?使用指针和非默认构造函数进行boost序列化
#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时,Foo :: data和Foo :: elements中没有元素。
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 2012-03-06 13:19:25
@Allan:您需要添加一个特定于反序列化的构造函数。例如一个构造函数,它在参数中使用boost存档。 – 2012-03-06 13:33:38
@Matthieu Ahh ..尽可能简单,谢谢。 Foo :: data怎么样,我应该将它序列化为指针,然后在反序列化时进行交换? – Allan 2012-03-06 13:41:14