2014-02-21 19 views
1

「每當我們調用指針(或引用)的序列化時,就會在必要時觸發它指向(或引用)的對象的序列化」 - A practical guide to C++ serialization在codeproject.com這篇文章有一個很好的解釋來說明如何序列化的指針也串行數據由指針指向,所以我寫了一個代碼來試試這個:指針的Boost序列化保存指針的十六進制值,而不是對象的內容

#include <fstream> 
#include <iostream> 

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 

class datta { 
public: 
    int integers; 
    float decimals; 

    datta(){} 
    ~datta(){} 

    datta(int a, float b) { 
     integers=a; 
     decimals=b; 
    } 

    void disp_datta() { 

     std::cout<<"\n int: "<<integers<<" float" <<decimals<<std::endl; 

    } 
private: 
    friend class boost::serialization::access; 
template<class Archive>    
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & integers; 
     ar & decimals; 
    } 
}; 

int main() { 

    datta first(20,12.56); 
    datta get; 
    datta* point_first; 
    datta* point_get; 

    point_first=&first; 

    first.disp_datta(); 
    std::cout<<"\n ptr to first :"<<point_first; 

//Serialize 

    std::ofstream abc("file.txt"); 
    { 
     boost::archive::text_oarchive def(abc); 
     abc << point_first; 
    } 

return 0; 
} 

運行此代碼後,我打開file.txt並找到一個十六進制指針地址,而不是這個地址指向的值,我也寫了一個反序列化代碼:

std::ifstream zxc("file.txt"); 
{ 
    boost::archive::text_iarchive ngh(zxc); 
    ngh >> point_get; 
} 

//Dereference the ptr and 

get = *point_get; 

get.disp_datta(); 
std::cout<<"\n ptr to first :"<<point_get; 

我在這裏遇到了分段錯誤!任何人都可以告訴我如何讓這個工作?非常感謝!

回答

3

你寫的對象流,沒有存檔:)

boost::archive::text_oarchive def(abc); 
    abc << point_first; 

嘗試

def << point_first; 

代替。結果:

22 serialization::archive 10 0 1 0 
0 20 12.56 

看到它Live (with deserialization) On Coliru

+0

對於指針反序列化,使用-lboost_system標誌是必要的嗎? – chetan92

+0

我試圖運行它沒有國旗,它仍然正常工作。 – chetan92

+0

最後設法運行它。非常感謝!人類信仰(或計算)恢復! – chetan92

0

你需要寫(使用運營商< <)指針到歸檔,而不是文件。你的代碼應該是:

std::ofstream abc("file.txt"); 
{ 
    boost::archive::text_oarchive def(abc); 
    def << point_first; 
} 
+1

這個答案究竟是如何增加洞察力的,而這個洞察力在我之前還沒有發佈,這是在此之前30分鐘發佈的? – sehe