Not Logged In

serpent 1.4

Because it only serializes literals and recreates the objects using ast.literal_eval(),
the serialized data is safe to transport to other machines (over the network for instance)
and de-serialize it there.

There is also a Java and a .NET (C#) implementation available. This allows for easy data transfer between the various ecosystems.
You can get the full source distribution, a Java .jar file, and a .NET assembly dll.Download location here

You can use ast.literal_eval yourself to deserialize, but serpent.deserialize works around a few corner cases. See source for details.

Serpent is more sophisticated than a simple repr() + literal_eval():

it serializes directly to bytes (utf-8 encoded), instead of a string, so it can immediately be saved to a file or sent over a socket

it encodes byte-types as base-64 instead of inefficient escaping notation that repr would use (this does mean you have
to base-64 decode these strings manually on the receiving side to get your bytes back)

it contains a few custom serializers for several additional Python types such as uuid, datetime, array and decimal

it tries to serialize unrecognised types as a dict (you can control this with __getstate__ on your own types)

it can create a pretty-printed (indented) output for readability purposes

it outputs the keys of sets and dicts in alphabetical order (when pretty-printing)

it works around a few quirks of ast.literal_eval() on the various Python implementations

Serpent allows comments in the serialized data (because it is just Python source code).
Serpent can’t serialize object graphs (when an object refers to itself); it will then crash with a recursion error.

Works with Python 2.6+ (including 3.x), IronPython 2.7+, Jython 2.7+.

FAQ

Why not use XML? Answer: because XML.

Why not use JSON? Answer: because JSON is quite limited in the number of datatypes it supports, and you can’t use comments in a JSON file.

Why not use pickle? Answer: because pickle has security problems.

Why not use repr()/ast.literal_eval()? See above; serpent is a superset of this and provides more convenience. Serpent provides automatic serialization mappings for types other than the builtin primitive types. repr() can’t serialize these to literals that ast.literal_eval() understands.

# This demo script is written for Python 3.2+# -*- coding: utf-8 -*-from__future__importprint_functionimportastimportuuidimportdatetimeimportpprintimportserpentclassDemoClass:def__init__(self):self.i=42self.b=Falsedata={"names":["Harry","Sally","Peter"],"big":2**200,"colorset":{"red","green"},"id":uuid.uuid4(),"timestamp":datetime.datetime.now(),"class":DemoClass(),"unicode":"€"}# serialize itser=serpent.dumps(data,indent=True)open("data.serpent","wb").write(ser)print("Serialized form:")print(ser.decode("utf-8"))# read it backdata=serpent.load(open("data.serpent","rb"))print("Data:")pprint.pprint(data)# you can also use ast.literal_eval if you likeser_string=open("data.serpent","r",encoding="utf-8").read()data2=ast.literal_eval(ser_string)assertdata2==data