在Python中是否有比“marshal”或“c​​Pickle”更低层的对象操作函数?

时间:2011-08-05 06:06:33

标签: python c

例如,根据Python的消息来源,Marshal仍在解析输入数据。

.....
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函数的提示都会很好。

2 个答案:

答案 0 :(得分:1)

如果您不需要一般地序列化Python对象,只对某些特定事物进行编码和解码,那么您可以查看struct module。此模块将用于直接处理表示C结构的字节字符串(例如:DNS协议数据包)。与Perl中的packunpack类似。

答案 1 :(得分:1)

不要以为你可以只获取python对象的内存映像,将其存储起来,将其加载到不同的解释器中,或者甚至在同一个解释器中加载它并期望它有意义。它不会。整数和浮点数可以完全包含在对象结构中,但是字符串已经为数据分配了一个单独的缓冲区,甚至很长。

换句话说,cPickle是可能的最低层(cPickle低于marshal,因为后者保持版本和平台之间的兼容性,cPickle不允许存储对象并将它们加载到另一个解释器或同一个解释器中,如果它们是从它们之间的内存中释放的。