root / trunk / pyopencoin / oc / tools.py

Revision 186, 2.1 kB (checked in by ocjhb, 4 years ago)

prioritize todo.txt
first go at persistence

  • Property svn:mime-type set to text/plain
  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1
2"""
3We need something way better. Prefereably serializing to Json.
4
5What are the core objects we need to serialize:
6
7Entities
8Containers
9Keypairs
10
11maybe we should cerealizer, and override methods / supply __getstate__ that follows
12the json format?
13
14"""
15
16
17
18def serialize(obj):
19    import pickle,base64
20    return base64.b64encode(pickle.dumps(obj))   
21
22
23def deserialize(data):
24    """
25    >>> import tests
26    >>> i = tests.makeIssuer()
27    >>> s = serialize(i)
28    >>> i2 = deserialize(s)
29    >>> i2.signedKeys = i.signedKeys
30    """
31    import pickle,base64
32    return pickle.loads(base64.b64decode(data))
33
34import json,entities,containers
35
36"lets write <Class json>"
37class MyJsonWriter(json.JsonWriter):
38    def _write(self, obj):
39        try:
40            json.JsonWriter._write(self,obj)
41        except json.WriteException:
42            if isinstance(obj,entities.Entity) or isinstance(obj,containers.Container):
43                self._append("%s %s>" % (str(obj.__class__)[:-1],obj.toJson()))
44            else:
45                raise WriteException, "Cannot write in JSON: %s" % repr(obj)           
46       
47
48class MyJsonReader(json.JsonReader):
49
50    def _read(self):
51        self._eatWhitespace()
52        peek = self._peek()
53        if peek is None:
54            raise ReadException, "Nothing to read: '%s'" % self._generator.all()
55        if peek == '{':
56            return self._readObject()
57        elif peek == '[':
58            return self._readArray()
59        elif peek == '"':
60            return self._readString()
61        elif peek == '-' or peek.isdigit():
62            return self._readNumber()
63        elif peek == 't':
64            return self._readTrue()
65        elif peek == 'f':
66            return self._readFalse()
67        elif peek == 'n':
68            return self._readNull()
69        elif peek == '/':
70            self._readComment()
71            return self._read()
72        elif peek == '<':
73            self._readClass()
74        else:
75            raise ReadException, "Input is not valid JSON: '%s'" % self._generator.all()
76       
77
78    def _readClass(self):
79        pass
80
81
82
83
84
85
86if __name__ == "__main__":
87    import doctest
88    doctest.testmod(optionflags=doctest.ELLIPSIS)
Note: See TracBrowser for help on using the browser.