2011-05-13 62 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