2012-08-15 57 views
3

我想爲我的代碼實現一個簡單的序列化/反序列化方法,以便能夠通過使用MPI的網絡傳遞一個對象。在理想的世界中,我會使用Boost.SerializationBoost.MPI,但它們沒有安裝在我有權訪問的某些羣集上,所以我正在考慮自己這樣做。沒有Boost.Serialization的序列化

我的策略是將每個對象序列化爲一個std::stringstream對象,然後通過MPI_Send使用MPI_CHAR作爲數據類型發送消息。在這種情況下,我會通過std::stringstream::str()::c_str()作爲指針,並將std::streaingstream::str()::size()*sizeof(char)作爲消息的大小。

我已經想通過如何序列化一切到一個std::stringstream對象。我的反序列化方法也需要一個std::stringstream對象並將所有事情反序列化。這工作正常,但我不知道如何從char的數組中創建一個std::stringstream對象,並避免從數組到數據流的額外副本。我應該改變我的反序列化方法,直接使用memcpy來代替char的數組嗎?

+1

爲什麼不使用應用程序捆綁Boost的構建版本(僅剝離您所需的版本)?那麼你不必擔心重新發明輪子。 – Greyson 2012-08-15 19:13:10

+1

看看這是否符合您的要求https://developers.google.com/protocol-buffers/docs/overview – user827992 2012-08-15 19:15:53

+0

發送二進制值時,應該使用MPI_BYTE而不是MPI_CHAR來避免MPI庫進行任何可能的轉換。 – 2012-08-16 08:02:13

回答

0

使用istrstream,它從char數組中提取。標頭爲<strstream>。而且,是的,它正式在C++標準中被棄用。委員會在早期沉迷於大量的一廂情願的想法。 istrstream不會消失。

1

這樣做的MPI方式,將使用MPI_PackMPI_Unpack。當然這就是C,可能不如使用C++特性的東西那麼方便。有關簡單示例,請參閱http://www.mcs.anl.gov/research/projects/mpi/tutorial/mpiexmpl/src/bcast/C/pack/solution.html

+0

這很有趣。現在我已經決定將memcpy中的所有內容都轉換爲char數組,然後發送該數組,然後在另一個進程上反序列化數組。 MPI_Pack也做類似的事情還是可以避免額外的副本? – GradGuy 2012-08-17 17:52:51