2

我正在开发一个基于 python 2.4 的项目(它是一个嵌入式 python 项目,所以我没有选择使用的 python 版本)。在整个应用程序中,我们使用array.array来存储数据。

在 2.5中添加了对酸洗array.array对象的支持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)
4

3 回答 3

2

您可以使用标准库模块copy_reg注册函数来处理本机不支持酸洗的类型的酸洗实例;cPickle将在需要时使用您注册的功能。我会将这种“钩子”方法完全应用于您对array.array.

于 2010-02-25T22:28:41.547 回答
1

我不确定是否可以使用__reduce__方法(可能使用子类)来扩展数组类型,但是您始终可以尝试将数组转换为序列并再次返回...如果内置扩展机制不起作用你。(黑客)

我以前没有尝试过,但是您可以尝试通过copy_reg__reduce__添加支持...与在您自己的类或子类上实现的结果基本相同,但更简洁。

于 2010-02-25T22:26:28.133 回答
1

看起来你可以腌制它们,但你不能取消腌制结果

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.'
>>> 
于 2010-02-25T22:34:14.007 回答