Created
July 22, 2009 08:53
-
-
Save sma/151889 to your computer and use it in GitHub Desktop.
simple serializer and deserializer for Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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