28.06.2017 Views

Python para todos

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Serialización de<br />

objetos<br />

Algunas veces tenemos la necesidad de guardar un objeto a disco <strong>para</strong><br />

poder recuperarlo más tarde, o puede que nos sea necesario mandar un<br />

objeto a través de la red, a otro programa en <strong>Python</strong> ejecutándose en<br />

otra máquina.<br />

Al proceso de transformar el estado de un objeto en un formato que se<br />

pueda almacenar, recuperar y transportar se le conoce con el nombre de<br />

serialización o marshalling.<br />

En <strong>Python</strong> tenemos varios módulos que nos facilitan esta tarea, como<br />

marshal, pickle, cPickle y shelve.<br />

El módulo marshal es el más básico y el más primitivo de los tres, y<br />

es que, de hecho, su propósito principal y su razón de ser no es el de<br />

serializar objetos, sino trabajar con bytecode <strong>Python</strong> (archivos .pyc).<br />

marshal sólo permite serializar objetos simples (la mayoría de los tipos<br />

incluidos por defecto en <strong>Python</strong>), y no proporciona ningún tipo de<br />

mecanismo de seguridad ni comprobaciones frente a datos corruptos o<br />

mal formateados. Es más, el formato utilizado <strong>para</strong> guardar el bytecode<br />

(y por tanto el formato utilizado <strong>para</strong> guardar los objetos con marshal)<br />

puede cambiar entre versiones, por lo que no es adecuado <strong>para</strong> almacenar<br />

datos de larga duración.<br />

pickle, por su parte, permite serializar casi cualquier objeto (objetos de<br />

tipos definidos por el usuario, colecciones que contienen colecciones,<br />

etc) y cuenta con algunos mecanismos de seguridad básicos. Sin embargo,<br />

al ser más complejo que marshal, y, sobre todo, al estar escrito en<br />

113

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!