我需要序列化一个简单的结构,它有一个类型为 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;
}
};
boost 是否真的支持 void* 指针的序列化,如果是的话.. 成员变量是否以错误的方式序列化?
最佳答案
No Boost Serialization 不支持 void*
的序列化.原因很简单,因为没有类型信息,所以它不可能告诉什么应该被序列化。
序列化指针恰好具有的值是完全无用的,因为在大多数平台上,这只是运行进程上下文中的一个临时地址,当您读回它时,该值将毫无意义。
因此,shared_ptr<void*>
也是没用的想法。 (除非,也许 void*
实际上是某种不透明的 HANDLE,并且您使用自定义删除器释放与该句柄对应的资源:Rule Of Zero article)。
所以,弄清楚你的 condition
里到底有什么收藏。修复类型以反射(reflect)这一点,或手动修复序列化代码以强制转换或强制将相关数据包含在存档中。
关于c++ - void* 指针类型的 boost 序列化无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23571682/