繁体   English   中英

使用cPickle在2.4中腌制array.array

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM