2009-02-07 73 views
75

我有一個需要序列化並通過套接字連接傳輸的小型對象層次結構。我需要序列化對象,然後根據它是什麼類型進行反序列化。有沒有一種簡單的方法來做到這一點在C + +(如在Java中)?如何序列化C++中的對象?

是否有任何C++序列化在線代碼示例或教程?

編輯:只是要清楚,我正在尋找方法將對象轉換爲字節數組,然後回到對象。我可以處理套接字傳輸。

+0

看看[STLPLUS] [1],lib與持久性實現。 [1]:http://stlplus.sourceforge.net/ – lsalamon 2009-02-09 02:06:50

+2

檢出[google :: protobuf](http://code.google.com/p/protobuf/),它是非常強大和快速的二進制序列化庫。我們用boost :: asio等成功地使用了它。 – Ketan 2009-02-07 15:28:19

+2

所提供的答案實際上並不能解釋*如何序列化。一個提供了boost序列化庫,另一個解釋了一個天真實現的陷阱。由於這是[tag:C++ - faq]問題,有人可以真正回答嗎? – 2016-06-23 20:30:01

回答

50

談到序列化,我想起了boost serialization API。至於通過網絡傳輸序列化數據,我要麼使用Berkeley套接字,要麼使用asio library

編輯:
如果你想序列的對象爲一個字節數組,你可以使用以下方式提升串行器(從教程網站獲取):

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
class gps_position 
{ 
private: 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & degrees; 
     ar & minutes; 
     ar & seconds; 
    } 
    int degrees; 
    int minutes; 
    float seconds; 

public: 
    gps_position(){}; 
    gps_position(int d, int m, float s) : 
    degrees(d), minutes(m), seconds(s) 
    {} 
}; 

實際序列化那麼很容易:

#include <fstream> 
std::ofstream ofs("filename.dat", std::ios::binary); 

    // create class instance 
    const gps_position g(35, 59, 24.567f); 

    // save data to archive 
    { 
     boost::archive::binary_oarchive oa(ofs); 
     // write class instance to archive 
     oa << g; 
     // archive and stream closed when destructors are called 
    } 

反序列化以類似的方式工作。

還有一些機制可以讓你處理指針的序列化(複雜的數據結構像髮辮等沒有問題),派生類,你可以選擇二進制和文本序列化。除了所有STL容器都支持開箱即用。

13

在某些情況下,簡單類型打交道時,你可以這樣做:

object o; 
socket.write(&o, sizeof(o)); 

這是確定作爲證據的概念或第一稿,你的團隊,以便其他成員可以繼續其他工作部分。

但遲早通常更早,這會讓你受傷!

您運行與問題:

  • 虛擬指針表將被破壞。
  • 指針(對數據/成員/函數)將被破壞。
  • 不同機器上填充/對齊的差異。
  • Big/Little-Endian字節排序問題。
  • float/double的實現變化。

(加上,你需要知道你是什麼拆包到接收端。)

您可以通過制定每類自己編組/解組的方法在此提高。 (理想的是虛擬的,所以它們可以在子類中進行擴展。)幾個簡單的宏將允許您以大/小端中立的順序快速寫出不同的基本類型。

但是那樣的努力工作要好得多,而且更容易通過boost's serialization library來處理。