2011-09-22 53 views
0

我正在一個項目中爲特定的軟件包編寫一個插件。C++序列化選項

這個包在其頭部實現了一個「新」方法,因此我不能包含<strstream>,因爲它也實現了「新」。

包sdk還包含一個稀疏和非常舊的boost版本,這意味着我不能使用boost序列化類。它建立在VS2008的Qt上,我們(這個項目需要)在VS2005中,所以我也不能包含Qt。

我需要能夠從外部運行的應用程序獲取數據,通過TCPIP發送數據。對於我來說,序列化來自數據源的數據並將其讀回到這些限制的最佳方式是什麼?

我目前試圖做一個結構,可能包含所有可能的數據可能被髮送過來,然後只是將該結構的內存複製到一個字節塊被髮送過來,但這聽起來像一個壞接近我。

感謝, Liron

+0

嘗試包括。 strstream可能會被編譯器棄用 – Arunmu

+0

當你說'實現新的'時,你究竟是什麼意思? 如果你需要它,你不能把用於單獨的編譯單元嗎? – Pete

+0

http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/66b85455-d667-44dc-adcb-1e1d2aa6f50b 我遇到了這個問題,但「新」的實現是在我們正在嘗試爲應用創建一個插件,所以我無法刪除它。 – Liron

回答

0

boost.serialization是去這裏的路。它是我知道的最易理解的C++序列化庫,它支持標準容器。

+0

我喜歡和使用Boost自己,但它的序列化庫只是一場災難。 – 2011-09-22 12:09:22

+0

不幸的是,boost並不是我們的選擇,因爲我們使用的SDK已經包含一箇舊版本的boost,它不包含序列化。 – Liron

+0

@LKIM:您可以在一個項目中始終使用兩個Boost庫,只需使用靜態鏈接即可。 – 2011-09-22 15:02:21

0

您可以從數據中提取字節並將其傳遞,請參閱基本示例。

QByteArray vectorToBin(const QVector<qint32> & vec) 
{ 
    size_t size = sizeof(qint16); 
    QByteArray result; 
    foreach(qint16 e, vec) { 
     for(int n = 0; n<=(size-1)*8; n+=8) { 
      char c = static_cast<char>((e >> n)); 
      result.append(c); 
     } 
    } 
    return result; 
} 

QVector<qint32> binToVector(const QByteArray & bytes) 
{ 
    QVector<qint32> result; 
    size_t size = sizeof(qint16); 
    for(int i=0; i<bytes.size(); i+=size) { 
     qint16 e = ((bytes[i+1] & 0xff)<<8) | (bytes[i] & 0xff); 
     result << e; 
    } 
    return result; 
} 
+0

因此,foreach將迭代我想要序列化的任何隨機類的所有字節? – Liron

+0

@LIMIM沒有foreach遍歷一個容器,這只是一個例子。你必須做的是給定的對象,獲取每個屬性的所有字節並裝入一個字節數組。對於原始類型,您對屬性的n = 0,8,16 ... sizeof進行n次移位。對作爲對象的分支重複該過程而不是基元類型。請注意,這是一個漫長的過程,最好的方法是使用strstream或其他序列化庫。 –