2015-05-29 41 views
4

我使用C++生成一些我想在Python程序中訪問的數據。我已經想出瞭如何使用C++提升序列化/反序列化二進制文件,但不知道如何在Python中訪問數據(不需要手動解析二進制文件)。C++中的boost :: serialization,Python中的反序列化

這裏是系列化我的C++代碼:

/* Save some data to binary file */ 
template <typename T> 
int serializeToBinaryFile(const char* filename, const T& someValue, 
          const vector<T>& someVector) 
{ 
    ofstream file(filename, ios::out | ios::binary | ios::trunc); 

    if (file.is_open()) 
    { 
     boost::archive::text_oarchive oa(file); 

     int sizeOfDataType = sizeof(T); 

     oa & sizeOfDataType; 
     oa & someValue; 
     oa & someVector; 

     file.close(); 

     return 0; 
    } else { 
     return 1; 
    } 
} 

這裏是我的下反序列化++代碼:

/* Load some data from binary file */ 
template <typename T> 
int deSerializeFromBinaryFile(const char* filename, int& sizeOfDataType, 
           T& someValue, vector<T>& someVector) 
{ 
    ifstream file(filename, ios::in | ios::binary); 

    if (file.is_open()) 
    { 
     boost::archive::text_iarchive ia(file); 

     ia & sizeOfDataType; 
     ia & someValue; 
     ia & someVector; 

     file.close(); 

     return 0; 
    } else { 
     return 1; 
    } 
} 

我如何加載一個Python程序的價值和矢量對象?

+1

你可以使用boost :: python包裝你的反序列化代碼並調用它。 – m0nhawk

+0

恕我直言,更好的方法是使用[Google protobuf](https://developers.google.com/protocol-buffers/docs/overview) – megabyte1024

回答

1

這不是它的工作方式。原則上,序列化/反序列化有兩個原因:

  1. 在同一SW軟件包中存儲和檢索。這就是提高存檔的原因。類型和歸檔格式沒有問題。

  2. 序列化與其他實體通信。這是一個完全不同的故事,因爲您必須處理機器字大小,操作系統,編程語言,本地化等等。在這裏,您通常首先描述從原始類型開始的序列化格式,如Int32,,Float以及複合類型如Sequence,List等等。然後,您會考慮如何用不同的編程語言來表示這些類型以及如何序列化/反序列化。您決定使用例如struct/namedtuple對於Sequencevector<>/list對於List。雖然boost並非專門爲此設計,但如果在描述序列化格式時考慮到這一點,則有機會使用xml存檔。

如果您想在同一臺機器上進行通信,有一種特殊情況。在這裏你可以包裝序列化(我強烈建議在C++和python一側使用相同的dll)。無論如何,你必須堅持pythons ctypes。

1

使用boost python將您的反序列化函數暴露給python。 您將需要分別暴露每種類型的函數(不能將模板暴露給python)。

+1

Richard Hodges建議使用便攜式格式(如XML),通常一個更好的選擇。 –

4

boost文檔提到二進制表示不可移植,甚至保證在不同版本的程序中保持一致的事實。

您可能想要使用boost :: serialization中提供的xml序列化程序,然後在python中使用xml解析器來讀取。

指令(和實例)有關如何做到這一點的位置:http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/tutorial.html#archives

注意使用NVP宏的名字在歸檔中的項目。

+0

當我轉向越來越大的數據大小時,XML是否更快? – fromGiants

+0

我不確定我是否理解這個問題。如果你問的是,解碼標籤的相對開銷是否隨着每個元素大小的增加而下降,我想答案是'是的,稍微',但實際上我不認爲速度是序列化爲文本文件。 –

+0

那麼,我想用這些方法來達到科學計算的目的。在某些情況下,我將使用參數存儲較小的文件,但通常情況下,我將存儲一堆具有10^6或更多雙精度元素的向量/數組。我的直覺告訴我,XML對於前一種應用來說是非常好的,但對於後者來說,卻非常緩慢。我想我應該考慮HDF5或NetCDF的後者? – fromGiants

相關問題