次のクラスをシリアル化するように定義しました。
using namespace std;
class MyElementObject
{
friend class boost::serialization::access;
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version) { }
};
template<class T>
class MyRecursiveObject
{
friend class boost::serialization::access;
public:
T element;
std::vector<MyRecursiveObject<T> > children;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & element;
ar & children;
}
};
次に、次のコードを実行します。
int main()
{
//MyRecursiveObject initialization
MyRecursiveObject<MyElementObject> rec_object;
rec_object.children.push_back(MyRecursiveObject<MyElementObject>());
rec_object.children[0].children.push_back(MyRecursiveObject<MyElementObject>());
//create vector of pointers to MyRecursiveObject's elements
vector<MyElementObject *> elt_ptrs;
elt_ptrs.push_back(&rec_object.element);
elt_ptrs.push_back(&rec_object.children[0].element);
elt_ptrs.push_back(&rec_object.children[0].children[0].element);
//serialize MyRecursiveObject and the vector of pointers
{
ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);
oa << rec_object;
oa << elt_ptrs;
}
//create new MyRecursiveObject and vector of pointers for deserialization
MyRecursiveObject<MyElementObject> rec_object_deserialized;
rec_object_deserialized.children.push_back(MyRecursiveObject<MyElementObject>());
rec_object_deserialized.children[0].children.push_back(MyRecursiveObject<MyElementObject>());
vector<MyElementObject *> elt_ptrs_deserialized;
//deserialize
{
ifstream ifs("filename");
boost::archive::text_iarchive ia(ifs);
ia >> rec_object_deserialized;
ia >> elt_ptrs_deserialized;
}
//compare deserialized pointers
cout<<"elt_ptrs first level="<<elt_ptrs_deserialized[0]
<<" expected="<<&rec_object_deserialized.element<<endl;
cout<<"elt_ptrs second level="<<elt_ptrs_deserialized[1]
<<" expected="<<&rec_object_deserialized.children[0].element<<endl;
cout<<"elt_ptrs third level="<<elt_ptrs_deserialized[2]
<<" expected="<<&rec_object_deserialized.children[0].children[0].element<<endl;
return 0;
}
そして、常に次のような出力が得られます。
elt_ptrs first level=0x7fff57c787c0 expected=0x7fff57c787c0
elt_ptrs second level=0x18e7020 expected=0x18e7020
elt_ptrs third level=0xffff8000ab5564f0 expected=0x18e7450
ポインター値からわかるように、要素を指すポインターを MyRecursiveObject の 2 番目の再帰レベルまで逆シリアル化できます。第 3 レベルまたはさらに深いレベルへのポインターを使用してそれを実行しようとすると、デシリアライゼーションは失敗します。
boost::serialization を間違って使用していますか?
MyRecursiveObject は、再帰レベルの数に関係なく、常に正常に逆シリアル化されることに注意してください。その要素へのポインターを逆シリアル化するだけで問題が発生します。
事前にありがとうキーン