2010-07-05 62 views
2

我在做一個需要通過網絡發送和接收數據的程序。我從來沒有處理對象序列化。我參考了一些關於Boost和Google Protocol Buffers的建議。在Linux中使用哪個是最好的?Linux的C++對象序列化

如果你知道一些其他的我會感謝你的幫助。

謝謝。

+0

可能是這個問題的重複? http://stackoverflow.com/questions/1855628/network-protocol-object-serialization-in-c – bjg 2010-07-05 21:24:09

+0

如何在不知道具體要求的情況下確定*最佳*? – 2010-07-06 02:11:13

回答

6

我用Boost.Serialization序列化對象,併發送它們通過套接字。這是一個非常靈活的庫,對象可以侵入被序列化,如果你有機會獲得他們

class Foo 
{ 
public: 
    template<class Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
     ar & _foo; 
     ar & _bar; 
    } 

    int _foo; 
    int _bar; 
}; 

或非侵入,如果你不能夠訪問你需要序列

namespace boost { 
namespace serialization { 

template<class Archive> 
void serialize(Archive& ar, Foo& f, const unsigned int version) 
{ 
    ar & f._foo; 
    ar & f._bar; 
} 

} // namespace serialization 
} // namespace boost 

有對象是技巧連載美孚,如果它不公開其成員(_foo_bar這裏),該documentation解釋這相當不錯。要序列化Foo,可以使用名稱空間boost::archive中的對象:text,binary或xml。

std::stringstream ss; 
boost::archive::text_oarchive ar(ss); 
Foo foo; 
foo._foo = 1; 
foo._bar = 2; 
ar << foo; 

重建歸檔到一個Foo對象,像這樣

boost::archive::text_iarchive ar(ss); 
Foo foo 
ar >> foo; 

注意,當你介紹一個網絡,你將使用插座和緩衝區這樣做的例子是相當瑣碎,很明顯。

+0

謝謝你的幫助。我會嘗試。 – 2010-07-06 03:13:04

+0

@盧卡斯,當你滿意時,你應該接受我們的答案之一,回答你的問題。 – 2010-07-06 11:52:52

1

如果您通過網絡傳輸數據時,我建議使用序列(不XML或類似)的二進制形式。 Qt offers classes for that,它允許您將Qt元系統中已知的任何類傳遞給數據流。

的問題是,C++真的不支持自省的語言功能,所以你必須要知道這是要序列化的數據。

在許多情況下的長度指示符(使用大端),隨後的數據是串行化數據的好方法。