2016-04-21 33 views
1

我試圖發送對象throught命名管道,但我不明白如何序列化我的對象:C++中的命名管道發送對象

class Order { 
public: 
    void       addFile(std::string const &file); 
    void       setType(Parser::Information const &type); 
    std::list<std::string>  getFileList() const; 
    Parser::Information   getType() const; 
    void       clear(); 

private: 
    std::vector<std::string>  fileList; 
    Parser::Information   type; 
}; 

我已經設法與我的命名管道工作基本的數據類型,但我不明白如何發送和接收一個完整的對象(不使用boost序列化)

我試圖把對象的數據放在一個結構,但我沒有設法通過命名管...可能是因爲矢量

有人可以分享他的知識請與我聯繫

+0

在C++中,一個結構是非常像的類。 –

+0

std :: vector,std :: list和std :: string都有指針。換句話說,要傳輸任何這些內容,您必須「消除」指針,並僅發送數據。很多方法來做到這一點。研究術語「持久存儲」。 –

+1

你需要爲此進行序列化。你需要編寫任何代碼,或使用現有的框架,(反)序列您從一個字節流對象(並)。 – Useless

回答

2

您需要將結構轉換爲適合單個字節數組的內容,該數組可以作爲內存塊寫入管道。一個字符串是最簡單的例子。

將數據格式化爲字符串的一種簡單而不靈活的方式是使用C++字符串流來寫入類型,然後是換行符,然後在fileList中寫入第一個條目,接着是換行符,然後是第二個條目,一個換行等。當管的遠端接收到該數據時,它必須讀取來自字符串的第一行,它解析成型,然後讀取每個下一行並將其添加到文件列表。 (如果你的命名管道是在網絡上,你可能希望將數據編碼爲UTF-8,以避免字符集問題。)

在實踐中,你想要的變量的數值更靈活的文件格式。一個常見的解決方案是JSON,它可以編碼多個結構,向量,布爾值,整數,雙精度值和其他值。 JSON始終是utf-8並且可以處理嵌套結構。 C++不是使用JSON的最簡單的語言,但它比自己的解決方案更好。一個可以讀取和寫入JSON數據的庫是https://github.com/open-source-parsers/jsoncpp

序列化格式的高端是二進制編碼,比基於字符串的數據解析要快得多。但是,二進制數據不是人類可讀的,所以調試起來可能會更困難。進行二進制編碼/解碼的庫的一個例子是Cap'n Proto,編號爲https://capnproto.org/