我有一个需要序列化的树类。编码:
#include <string>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/tracking.hpp>
using namespace std;
class AVLtree {
public:
string name;
int fid;
int p1;
int n1;
double ig;
AVLtree *left; // left subtree
AVLtree *right; // right subtree
int height; // height of the tree
long TotalNodes;
};
BOOST_CLASS_TRACKING(AVLtree, track_always)
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive &ar, AVLtree &tree, const unsigned int version) {
ar & tree.name;
ar & tree.fid;
ar & tree.p1;
ar & tree.n1;
ar & tree.ig;
ar & tree.height;
ar & tree.TotalNodes;
ar & *tree.left; // Haven't yet tried it with *tree.left, but just tree.left saves the memory address, not the object
ar & *tree.right;
} // end serialize()
} // end namespace serialization
} // end namespace boost
我在此站点和Boost文档中都在线查看了许多其他注释和代码示例,但是我看不到如何处理这种递归情况。其中类包含两个相同类型的对象的指针。我应该如何修改树或序列化函数以使其起作用?谢谢。
最佳答案
恕我直言,您应该将tree.left
和tree.right
序列化为指针,而不是对象。它们有时可以并且应该等于NULL(否则,树将是无限的)。
您的代码还需要一个适当的默认构造函数,该构造函数将这些成员设置为NULL。从您的代码中还不清楚谁拥有并销毁了这些树。我会考虑禁止复制构造函数(例如,从boost::noncopyable派生您的类)。
您不需要宏BOOST_CLASS_TRACKING(AVLtree, track_always)
,Boost.Serialize仍将应用它,因为您将序列化(某些)AVLtree作为指针。
这样就可以了,Archive旨在处理“反向指针”。递归结构是小菜一碟。
祝好运!
关于c++ - 促进树的序列化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19669617/