[英]Pickling array.array in 2.4 using cPickle
我正在开发一个基于python 2.4的项目(这是一个嵌入式python项目,因此我对所使用的python版本没有选择)。 在整个应用程序中,我们使用array.array
来存储数据。
对酸洗array.array
对象的支持已在2.5中添加到pickle
(和cPickle
)中。 当使用纯python pickle类(我们将Pickler / Unpickler子类化以处理数组)时,我们在2.4中有一个可行的解决方法,但这不适用于cPickle(由于性能问题,我们需要这样做)。
有什么建议么?
编辑-解决方案:
这是似乎有效的最终代码(感谢建议):
# Add serialization for array objects
def array_unpickler(data):
return array.array(data[0], data[1:])
def array_pickler(arr):
return array_unpickler, ("%s%s" % (arr.typecode, arr.tostring()),)
copy_reg.pickle(array.ArrayType, array_pickler, array_unpickler)
您可以使用标准库模块copy_reg来注册函数以处理本身不支持酸洗的类型的酸洗实例。 cPickle
将在需要的地方使用您注册的功能。 我将这种“挂钩”方法完全应用于您对array.array
实例进行酸洗的array.array
。
我不确定数组类型是否可以使用__reduce__
方法(可能带有子类)进行扩充,但是您始终可以尝试将数组转换为序列并再次返回...如果内置扩展机制不起作用为了你。 (破解版)
我以前没有尝试过,但是您可以尝试通过copy_reg添加支持...本质上与在您自己的类或子类上实现__reduce__
结果相同,但效果__reduce__
。
看起来您可以腌制它们,但不能腌制结果
Python 2.4.5 (#2, Jan 21 2010, 20:05:55)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cPickle as pickle
>>> import array
>>> a=array.array('i','12345678')
>>> pickle.dumps(a,2)
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> b=pickle.loads(_)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: array() takes at least 1 argument (0 given)
看起来转储甚至不包含有关类型代码的信息。甚至数据:(
>>> a=array.array('c','abcdefghijkl')
>>> pickle.dumps(a,2)
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.