Skip to content

Instantly share code, notes, and snippets.

@sma
Created July 22, 2009 08:53
Show Gist options
  • Save sma/151889 to your computer and use it in GitHub Desktop.
Save sma/151889 to your computer and use it in GitHub Desktop.
simple serializer and deserializer for Python
import re
class Serializer(object):
def __init__(self):
self.s, self.r = "", {}
def write(self, o):
self.s += self.to_s(o); return self.s
def to_s(self, o):
if o is None: return "N"
if o is True: return "T"
if o is False: return "F"
if isinstance(o, int): return "I%i" % o
if isinstance(o, str): return "S%r" % o
if id(o) in self.r: return "R%i" % self.r[id(o)]
self.r[id(o)] = len(self.r)
if isinstance(o, tuple): return self.seq_to_s("(", o)
if isinstance(o, list): return self.seq_to_s("[", o)
if isinstance(o, dict): return self.seq_to_s("{", o.items())
raise ValueError, o
def seq_to_s(self, tp, l):
return "%s%s;" % (tp, "".join(self.to_s(e) for e in l))
class Deserializer(object):
def __init__(self, s):
self.t = iter(re.findall(r"[NTFISR(\[{;]|-?\d+|'[^']*'|\"[^\"]*\"", s)).next
self.r = {}
def read(self, t=None):
if t is None: t = self.t()
if t == "N": return None
if t == "T": return True
if t == "F": return False
if t == "I": return int(self.t())
if t == "S": return self.t()[1:-1].decode("string-escape")
if t == "R": return self.r[int(self.t())]
if t == "(": return self.register(tuple(self.read_seq([])))
if t == "[": return self.read_seq(self.register([]))
if t == "{": d = self.register({}); d.update(self.read_seq([])); return d
raise ValueError, t
def read_seq(self, seq):
t = self.t()
while t != ';':
seq.append(self.read(t)); t = self.t()
return seq
def register(self, o):
self.r[len(self.r)] = o; return o
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment