使用cPickle的酸洗array.array在2.4
-
22-09-2019 - |
题
我就建在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.'
>>>
不隶属于 StackOverflow