我就建在Python 2.4中的一个项目工作(这是一个嵌入式Python项目,所以我没有使用的Python版本的选择)。在整个申请中,我们使用array.array来存储数据。

有酸洗array.array对象支持在2.5加入到pickle(和cPickle)。我们在2.4可行的解决方法使用纯Python咸菜类(我们的子类皮克勒/ Unpickler会处理数组)时,但这并不与cPickle的工作(我们需要这个由于性能问题)。

任何建议?

修改 - SOLUTION:

这是似乎是工作(对于建议感谢)最后的代码:

# 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的情况下的需求。

其他提示

我不知道,如果数组类型可以用__reduce__方法(或许还有一个子类)来增加,但你总是可以尝试转换您的阵列序列&回来......如果内置的扩展机制韩元你“T工作。 (黑客)

我以前没有尝试过这一点,但你可以尝试通过加入支持copy_reg ...基本相同的结果作为自己的类或子类,但一点点清洁的实施__reduce__

像您长得可以泡制他们,但你不能unpickle结果

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)

看起来的转储甚至不包括关于typecode..or信息甚至数据:(

>>> a=array.array('c','abcdefghijkl') 
>>> pickle.dumps(a,2)                                                                                                                                                                             
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top