void *指针类型的boost序列化无法编译

时间:2014-05-09 18:31:47

标签: c++ serialization boost boost-serialization

我需要序列化一个具有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 *指针的序列化的支持,如果是..是成员变量以错误的方式串行化?

1 个答案:

答案 0 :(得分:1)

No Boost Serialization不支持void*的序列化。由于简单的原因,没有类型信息,因此无法告诉应该序列化什么

序列化指针恰好具有的值是完全没用的,因为在大多数平台上,这只是运行过程上下文中的临时地址,当您读回它时,该值将毫无意义。

出于这个原因,shared_ptr<void*>也是一个无用的想法。 (除非,void*实际上是某种不透明的HANDLE,并且您使用自定义删除器来释放与该句柄相对应的资源:Rule Of Zero article)。

所以,找出你condition集合中的真实内容。修复类型以反映该类型,或手动修复序列化代码以进行强制转换,以及强制在归档中包含相关数据。