我有一個需要序列化並通過套接字連接傳輸的小型對象層次結構。我需要序列化對象,然後根據它是什麼類型進行反序列化。有沒有一種簡單的方法來做到這一點在C + +(如在Java中)?如何序列化C++中的對象?
是否有任何C++序列化在線代碼示例或教程?
編輯:只是要清楚,我正在尋找方法將對象轉換爲字節數組,然後回到對象。我可以處理套接字傳輸。
我有一個需要序列化並通過套接字連接傳輸的小型對象層次結構。我需要序列化對象,然後根據它是什麼類型進行反序列化。有沒有一種簡單的方法來做到這一點在C + +(如在Java中)?如何序列化C++中的對象?
是否有任何C++序列化在線代碼示例或教程?
編輯:只是要清楚,我正在尋找方法將對象轉換爲字節數組,然後回到對象。我可以處理套接字傳輸。
談到序列化,我想起了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容器都支持開箱即用。
在某些情況下,簡單類型打交道時,你可以這樣做:
object o;
socket.write(&o, sizeof(o));
這是確定作爲證據的概念或第一稿,你的團隊,以便其他成員可以繼續其他工作部分。
但遲早通常更早,這會讓你受傷!
您運行與問題:
(加上,你需要知道你是什麼拆包到接收端。)
您可以通過制定每類自己編組/解組的方法在此提高。 (理想的是虛擬的,所以它們可以在子類中進行擴展。)幾個簡單的宏將允許您以大/小端中立的順序快速寫出不同的基本類型。
但是那樣的努力工作要好得多,而且更容易通過boost's serialization library來處理。
看看[STLPLUS] [1],lib與持久性實現。 [1]:http://stlplus.sourceforge.net/ – lsalamon 2009-02-09 02:06:50
檢出[google :: protobuf](http://code.google.com/p/protobuf/),它是非常強大和快速的二進制序列化庫。我們用boost :: asio等成功地使用了它。 – Ketan 2009-02-07 15:28:19
所提供的答案實際上並不能解釋*如何序列化。一個提供了boost序列化庫,另一個解釋了一個天真實現的陷阱。由於這是[tag:C++ - faq]問題,有人可以真正回答嗎? – 2016-06-23 20:30:01