我必须在我的程序中序列化libkdtree ++,树结构简要描述如下:
struct _Node_base {
_Node_base * _M_parent, *_M_left, * _M_right;
template<Archive>
serialize(Archive &ar, const unsigned int version) {
ar & _M_left & _M_right;
}
}
template<typename V>
struct _Node : public _Node_base {
typedef V value_type;
value_type value;
template<Archive>
serialize(Archive &ar, const unsigned int version) {
ar.register_type(static_cast<_Node*>(NULL));
ar & boost::serialization::base_object<_Node_base>(*this);
ar & value;
}
}
struct Tree {
_Node * root;
template<Archive>
serialize(Archive &ar, const unsigned int version) {
ar & root;
}
}
此程序报告“流错误”。 但是从“serailzed文件”中,它缺少了根节点子节点的值字段。因此,我认为BaseNode可能序列化了_M_left和_M_right指针。但是由于_Node_base不知道_Node的值类型,所以很难将“ar.register_type”添加到_Node_base.serialize()。
答案 0 :(得分:0)
答案 1 :(得分:0)
libkdtree ++&amp;的以下解决方案boost :: serialization似乎有效:
// KDTree::_Node
friend class boost::serialization::access;
template<class Archive>
//void serialize(Archive & ar, const unsigned int version)
void save(Archive & ar, const unsigned int version) const
{
ar.register_type(static_cast< _Link_type>(NULL));
ar & boost::serialization::base_object<_Node_base>(*this);
_Link_type left = static_cast<_Link_type>(_M_left);
_Link_type right = static_cast<_Link_type>(_M_right);
ar & left & right;
ar & _M_value;
}
template<class Archive>
void load(Archive & ar, const unsigned int version)
{
ar.register_type(static_cast< _Link_type>(NULL));
ar & boost::serialization::base_object<_Node_base>(*this);
_Link_type left, right;
ar & left & right;
ar & _M_value;
if (left) {
left->_M_parent = this;
}
if (right) {
right->_M_parent = this;
}
_M_left = left;
_M_right = right;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()