2014-05-09 46 views
1

我需要序列化一個簡單的結構,其中有一個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

假設這是你的真實代碼:如果你想能夠序列化該變量,你必須以某種方式告訴boost :: serialization void *實際上指向的是什麼。從序列化的角度來看,它是一個通用指針,它不知道如何處理它。如果這是一個例子(我希望它,因爲'shared_ptr '是一個可怕的想法),那麼我們需要更多的信息。 –

回答

1

無增強序列化不支持序列化void*。出於簡單的原因,沒有類型信息,所以它不可能告訴什麼應該序列化。

將指針碰巧存在的值序列化是完全沒有用的,因爲在大多數平臺上,這只是運行過程上下文中的臨時地址,當您讀取它時,該值將毫無意義。

因此,shared_ptr<void*>也是無用的想法。 (除非,也許void*實際上是某種不透明的HANDLE,並且您使用自定義刪除程序來釋放與該句柄對應的資源:Rule Of Zero article)。

因此,找出您的condition集合中真的有什麼。修正該類型以反映該類型,或者手動修復序列化代碼以強制轉換,並強制將相關數據包含在歸檔中。

+0

條件需要指向X類型的變量。我們可以像shared_ptr 條件那樣使用它,然後序列化它 – user1291401

+0

當然。你爲什麼還要做其他事情? – sehe

相關問題