例如,根据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”或“cPickle”更低层的对象操作函数?
例如,我已经将转储的数据加载到内存中,我只想在C / C ++中进行类型转换,(PyObject *) data_loaded_in_memory;
编辑:如果不能直接在python中完成,那么任何有关C函数的提示都会很好。
答案 0 :(得分:1)
如果您不需要一般地序列化Python对象,只对某些特定事物进行编码和解码,那么您可以查看struct
module。此模块将用于直接处理表示C结构的字节字符串(例如:DNS协议数据包)。与Perl中的pack
和unpack
类似。
答案 1 :(得分:1)
不要以为你可以只获取python对象的内存映像,将其存储起来,将其加载到不同的解释器中,或者甚至在同一个解释器中加载它并期望它有意义。它不会。整数和浮点数可以完全包含在对象结构中,但是字符串已经为数据分配了一个单独的缓冲区,甚至很长。
换句话说,cPickle
是可能的最低层(cPickle
低于marshal
,因为后者保持版本和平台之间的兼容性,cPickle不允许存储对象并将它们加载到另一个解释器或同一个解释器中,如果它们是从它们之间的内存中释放的。