Pregunta

Estoy trabajando en un proyecto construido en Python 2.4 (que es un proyecto de Python incrustado, por lo que no tengo elección de la versión de Python se utiliza). A lo largo de la aplicación, utilizamos array.array para almacenar datos.

Soporte para el decapado de objetos array.array se añadió a pickle (y cPickle) en 2,5. Tenemos una solución viable en 2.4 cuando se utiliza la clase pitón salmuera pura (que subclase Pickler / Unpickler a las matrices de mango), pero esto no funciona con cPickle (necesitamos esto debido a problemas de rendimiento).

¿Alguna sugerencia?

Editar - SOLUCIÓN:

Este es el código final que parece estar funcionando (gracias por las sugerencias):

# 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)
¿Fue útil?

Solución

Se puede usar la biblioteca estándar de módulo copy_reg para registrar funciones para hacer frente a decapado instancias de tipos que no son compatibles de forma nativa decapado; cPickle utilizará sus funciones registradas cuando sea necesario. Me aplico exactamente este enfoque "gancho" a su requerimiento de decapado casos de array.array.

Otros consejos

No estoy seguro de si el tipo de matriz se puede aumentar con un método __reduce__ (tal vez con una subclase), pero siempre se podría tratar de convertir las matrices de secuencias y de nuevo ... si la incorporada en el mecanismo de extensión de won 't trabajo para usted. (Corte)

No he intentado esto antes, pero se puede tratar de añadir soporte a través de copy_reg ... esencialmente el mismo resultado que la aplicación de __reduce__ en su propia clase o subclase, pero un poco más limpio.

parece que se puede conservar en vinagre, pero no se puede unpickle el resultado

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)

Mira los los vertederos ni siquiera incluye información sobre el typecode..or incluso los datos: (

>>> a=array.array('c','abcdefghijkl') 
>>> pickle.dumps(a,2)                                                                                                                                                                             
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top