boost :: serializationを使用してこのクラスをシリアル化/逆シリアル化しますか?ポインタと非デフォルトのコンストラクタによるブーストシリアル化
#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をポイントする必要があります。
EDIT:以下は私の試み
の非稼働実装です。これは@Matthieuからヒントをもとに、私の試みです。問題は、私がFooを非直列化すると、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ああ..このように簡単です、ありがとう。 Foo :: dataはどうすればいいですか?ポインタとしてシリアル化してデシリアライズするときにスワップする必要がありますか? – Allan