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

标签 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;
      } 

   };

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/

相关文章:

c++ - boost 事件系统

visual-studio-2010 - 如何通过b2使用pdb文件构建boost库

c++ - 如何专门化模板类成员函数?

c# - 为什么复杂字符串(字符串化的 json 数据)不被接受为 Web API 方法的 POST 参数,而简单字符串却可以?

c++ - Qt TCP 客户端/服务器聊天应用程序。如何发送私信

java二进制文件操作

java - Spring 无法通过requestBody将String转换为Date

c# - 相当于 System::String::Format ("{0:D9}", x);

c++ - ostream 是如何管理内存的?

c++ - 在可变参数模板方法和普通模板方法之间进行选择的规则是什么?