2011-05-13 52 views
2

我想知道如果C有任何類似的python pickle模塊,可以轉儲磁盤上的一些結構化數據,然後再加載回來。C有什麼像python pickle的對象序列化?

我知道我可以將我的結構逐字節地寫入磁盤上的文件,然後再讀回來,但採用這種方法還是有一些工作要做。例如,如果我有一個鏈接列表結構,我可以從頭到尾遍歷列表,並將每個節點的數據寫入磁盤。當我從磁盤文件讀回列表時,我必須重建每對節點之間的所有鏈接 。

請告知是否有更簡單的方法。

謝謝堆!

+0

C的一點是,它不會爲您提供大量的高級抽象,因爲高級抽象通常不完美,對於您的特定任務可能會很慢。 – 2011-05-13 04:26:20

回答

4

我擔心這個問題上強調否。 C具有基本的文件I/O。任何數據結構都由您決定。組成一個格式,把它翻出來,讀入。

可能有圖書館可以做到這一點,但本身沒有C不這樣做。

2

的C庫函數fread(3)fwrite(3)將讀取和寫入「數據元素」,但是這是說:「C庫會做一些乘法和幕後pread(2)pwrite(2)調用來填補你的陣列」的美麗幻想的方式。

可以使用它們struct S,但它可能不是一個好主意:在結構

  • 孔被寫入和讀取
  • 你在你的整數的字節序烘焙

雖然您可以製作自己的寫入對象格式,但您可能需要查看應用程序是否可以使用SQLite3來存儲對象的磁盤。它很好的調試,如果你的應用程序適合它的能力,它可能只是票。 (和一個lot比編寫所有自己的格式代碼更容易。)

+0

這些洞並不重要。這是序列化大小的輕微增加,以及讀入或寫出永遠不會被訪問的垃圾的輕微減速,但不會產生積極的危害。 – 2011-05-13 04:32:18

+0

@Chris,如果數據用來包含私有密鑰,密碼或其他私有數據的一部分,而這些私有數據在被free()之前未被清除,那麼它會[導致安全問題](http: //cwe.mitre.org/data/definitions/226.html)。 – sarnold 2011-05-13 04:41:37

+0

@sarnold - 說你的安全性可以通過'struct'路徑中裂縫的_fragments_來破壞你的安全。 – 2011-05-13 04:43:39

-1

Boost有serialization library,如果用「C」表示「C或C++」。

+1

「C或C++」不存在。如果問題的標籤是[c]而不是[C++]',請不要提供C++答案。 – 2011-05-13 04:38:22

+0

@Chris Lutz,我注意到這個問題也被標記爲「python」。這是否意味着將Python嵌入到C中的答案是可以接受的? – 2011-05-13 04:47:04