Повысить сериализацию дерева?

У меня есть класс дерева, который мне нужно сериализовать. Код:

#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, но я не понимаю, как справиться с рекурсивной ситуацией, подобной этой. Где класс содержит два указателя объектов одного типа. Как мне изменить дерево или функцию сериализации, чтобы это работало? Спасибо.

2

Решение

ИМХО, ты должен сериализации tree.left а также tree.right как указатели, а не объекты. Иногда они могут и должны быть равны NULL (иначе ваше дерево будет бесконечным).

Вашему коду также нужен правильный конструктор по умолчанию, который устанавливает эти члены в NULL. Из вашего кода также не ясно, кто владеет и уничтожает деревья. Я хотел бы рассмотреть вопрос о запрете конструктора копирования (например, получить ваш класс из boost :: noncopyable).

Вам не нужен макрос BOOST_CLASS_TRACKING(AVLtree, track_always)Boost.Serialize будет применять его в любом случае, так как вы будете сериализовать (некоторые) AVLtree (s) в качестве указателей.

Это будет прекрасно работать, архив предназначен для работы с «указателями назад»; рекурсивная структура — кусок пирога для этого.

Удачи!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]