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

boost serialization for void* pointer type does not compile

本文关键字:序列化 编译 Boost 指针 类型 void      更新时间:2023-10-16

我需要序列化一个简单的结构体,它有一个指针类型void *,但当我序列化它给出错误"C2338: boost::serialization::tracking_level::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*指针的序列化,如果是的话…

成员变量序列化方式是否错误?

No Boost Serialization不支持void*的序列化。原因很简单,因为没有类型信息,所以它不可能告诉应该序列化哪些

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

因此,shared_ptr<void*>也是一个无用的想法。(除非,也许,void*实际上是某种不透明的句柄,并且您使用自定义删除器来释放对应于该句柄的资源:零规则文章)。

所以,弄清楚你的condition集合中到底有什么。修复类型以反映这一点,或者手动修复序列化代码以强制在存档中包含相关数据。