marshal vs pickle

Raymond Hettinger python at rcn.com
Wed Oct 31 23:10:48 CET 2007


On Oct 31, 12:27 pm, Aaron Watters <aaron.watt... at gmail.com> wrote:
> Anyway since it's easy and makes sense I think
> the next version of nucular will have a
> switchable option between marshal and cPickle
> for persistant storage.

Makes more sense to use cPickle and be done with it.

FWIW, I've updated the docs to be absolutely clear on the subject:

'''
This is not a general "persistence" module.  For general persistence
and
transfer of Python objects through RPC calls, see the
modules :mod:`pickle` and
:mod:`shelve`.  The :mod:`marshal` module exists mainly to support
reading and
writing the "pseudo-compiled" code for Python modules of :file:`.pyc`
files.
Therefore, the Python maintainers reserve the right to modify the
marshal format
in backward incompatible ways should the need arise.  If you're
serializing and
de-serializing Python objects, use the :mod:`pickle` module instead --
the
performance is comparable, version independence is guaranteed, and
pickle
supports a substantially wider range of objects than marshal.

.. warning::

   The :mod:`marshal` module is not intended to be secure against
erroneous or
   maliciously constructed data.  Never unmarshal data received from
an
   untrusted or unauthenticated source.

Not all Python object types are supported; in general, only objects
whose value
is independent from a particular invocation of Python can be written
and read by
this module.  The following types are supported: ``None``, integers,
long
integers, floating point numbers, strings, Unicode objects, tuples,
lists,
dictionaries, and code objects, where it should be understood that
tuples, lists
and dictionaries are only supported as long as the values contained
therein are
themselves supported; and recursive lists and dictionaries should not
be written
(they will cause infinite loops).

.. warning::

   Some unsupported types such as subclasses of builtins will appear
to marshal
   and unmarshal correctly, but in fact, their type will change and
the
   additional subclass functionality and instance attributes will be
lost.

.. warning::

   On machines where C's ``long int`` type has more than 32 bits (such
as the
   DEC Alpha), it is possible to create plain Python integers that are
longer
   than 32 bits. If such an integer is marshaled and read back in on a
machine
   where C's ``long int`` type has only 32 bits, a Python long integer
object
   is returned instead.  While of a different type, the numeric value
is the
   same.  (This behavior is new in Python 2.2.  In earlier versions,
all but the
   least-significant 32 bits of the value were lost, and a warning
message was
   printed.)
'''




More information about the Python-list mailing list