2011-08-05 57 views
2

例如,根據Python的資料,Marshal仍在解析輸入數據。Python中是否有比「marshal」或「c​​Pickle」更低層的對象操作函數?

..... 
case TYPE_FALSE: 
    Py_INCREF(Py_False); 
    retval = Py_False; 
    break; 

case TYPE_TRUE: 
    Py_INCREF(Py_True); 
    retval = Py_True; 
    break; 

case TYPE_INT: 
    retval = PyInt_FromLong(r_long(p)); 
    break; 

case TYPE_INT64: 
    retval = r_long64(p); 
    break; 

case TYPE_LONG: 
    retval = r_PyLong(p); 
    break; 

case TYPE_FLOAT: 
....... 

Python中是否有比「marshal」或「c​​Pickle」更低層的對象操作函數?

舉例來說,我已經加載轉儲的數據到內存中,我只想類型轉換就像我們可以用C/C++做,(PyObject *) data_loaded_in_memory;

編輯:如果不能在Python直接完成,任何關於C函數的提示都可以寫出這個能力。

+0

你能澄清數據如何能在內存中,但不會是一個Python對象,或味酸對象,等等? – agf

+0

@agf,這可能是因爲可以直接鍵入強制轉換的PyObject或種類的泡菜對象,元帥對象或一些更原始轉儲。數據可以通過另一個C函數直接加載到內存中。 – YOU

+0

我不認爲你可以只是把Python對象的內存映像,儲存,載入它在不同的解釋,甚至後,同樣的一個,並期望它是有意義的。它不會。換句話說,'cPickle'是儘可能低的層('CPickle'比'marshal'較低的水平,這是因爲後來維護版本和平臺之間的兼容性,這'cPickle'不)。 –

回答

1

不要以爲你可以只取Python對象的內存映像,儲存,載入它在不同的解釋,甚至後,同樣的一個,並期望它是有意義的。它不會。整數和浮點數可以完全包含在對象結構中,但字符串已經爲數據分配了一個緩衝區,甚至很長。

換句話說,cPickle是儘可能低的層(cPicklemarshal較低水平,這是因爲後來維護版本和平臺之間的兼容性,這cPickle的不),允許存儲的對象,並且在另一個解釋器或加載它們同樣的口譯員,如果他們從記憶中釋放出來的話。

1

如果你並不真的需要序列化Python對象一般只有編碼和解碼某些特定的東西,那麼你可能看struct module。該模塊將用於直接處理表示C結構的字節串(例如:DNS協議數據包)。 Perl中類似的想法packunpack

相關問題