我需要序列化一个具有void *类型指针的简单结构,但是当我序列化它时会出现错误" C2338:boost :: serialization :: tracking_level< T> :: value!= boost :: serialization :: track_never"指向第167行的shared_ptr.hpp 。以下是代码
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/optional.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/shared_ptr.hpp>
struct Man
{
Man();
virtual ~Man();
std::list<boost::shared_ptr<void *>> condition;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & condition; // if i comment this line.. issue goes away..
}
};
struct SuperMan
{
public:
SuperMan(void);
SuperMan(const parameter_strings & parms);
virtual ~SuperMan(void);
boost::optional<anyURI> detail;
boost::optional<SuperManInfo> SuperMan_info;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & SuperMan_info;
ar & detail;
}
};
确实提升了对void *指针的序列化的支持,如果是..是成员变量以错误的方式串行化?
答案 0 :(得分:1)
No Boost Serialization不支持void*
的序列化。由于简单的原因,没有类型信息,因此无法告诉应该序列化什么。
序列化指针恰好具有的值是完全没用的,因为在大多数平台上,这只是运行过程上下文中的临时地址,当您读回它时,该值将毫无意义。
出于这个原因,shared_ptr<void*>
也是一个无用的想法。 (除非,void*
实际上是某种不透明的HANDLE,并且您使用自定义删除器来释放与该句柄相对应的资源:Rule Of Zero article)。
所以,找出你condition
集合中的真实内容。修复类型以反映该类型,或手动修复序列化代码以进行强制转换,以及强制在归档中包含相关数据。