serialization: add support for Arrays
authorAlexis Laferrière <alexis.laf@xymus.net>
Sat, 1 Feb 2014 18:35:32 +0000 (13:35 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Sat, 8 Feb 2014 02:54:23 +0000 (21:54 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/json_serialization.nit
lib/serialization.nit
tests/sav/test_serialization.res
tests/sav/test_serialization_redef.res
tests/sav/test_serialization_redef_alt0.res
tests/sav/test_serialization_redef_alt1.res
tests/sav/test_serialization_redef_alt2.res
tests/test_serialization.nit

index 4b15e88..4b47eff 100644 (file)
@@ -106,3 +106,19 @@ redef class NativeString
        redef fun serialize_to_json(v) do to_s.serialize_to_json(v)
 end
 
+redef class Array[E]
+       redef fun serialize_to_json(v) do
+               v.stream.write "["
+               var is_first = true
+               for e in self do
+                       if is_first then
+                               is_first = false
+                       else v.stream.write(", ")
+                       
+                       if not v.try_to_serialize(e) then
+                               v.warn("element of type {e.class_name} is not serializable.")
+                       end
+               end
+               v.stream.write "]"
+       end
+end
index f673ded..1ed25a8 100644 (file)
@@ -76,3 +76,4 @@ redef class Int super DirectSerializable end
 redef class Float super DirectSerializable end
 redef class NativeString super DirectSerializable end
 redef class String super DirectSerializable end
+redef class Array[E] super Serializable end
index 385bf06..c2d7af2 100644 (file)
@@ -2,24 +2,24 @@
 <A: true a 0.123 1234 asdf false>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null}
+{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}
 
 # Nit:
 <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "ii": 1111, "ss": "qwer"}
+{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer"}
 
 # Nit:
 <C: <A: true a 0.123 1234 asdf false> <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
+{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
 
 # Nit:
 <D: <B: <A: false b 123.123 2345 new line ->
 <- false> 1111         f"\r\/> true>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "ii": 1111, "ss": "\tf\"\r\\\/", "d": {"__kind": "ref", "__id": 0}}
+{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "\tf\"\r\\\/", "d": {"__kind": "ref", "__id": 0}}
 
index 385bf06..c2d7af2 100644 (file)
@@ -2,24 +2,24 @@
 <A: true a 0.123 1234 asdf false>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null}
+{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}
 
 # Nit:
 <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "ii": 1111, "ss": "qwer"}
+{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer"}
 
 # Nit:
 <C: <A: true a 0.123 1234 asdf false> <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
+{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
 
 # Nit:
 <D: <B: <A: false b 123.123 2345 new line ->
 <- false> 1111         f"\r\/> true>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "ii": 1111, "ss": "\tf\"\r\\\/", "d": {"__kind": "ref", "__id": 0}}
+{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "\tf\"\r\\\/", "d": {"__kind": "ref", "__id": 0}}
 
index bce0ed3..903e9bd 100644 (file)
@@ -2,24 +2,24 @@
 <A: true a 0.123 1234 asdf false>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "iii": 6789, "sss": "redef"}
+{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef"}
 
 # Nit:
 <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer"}
+{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer"}
 
 # Nit:
 <C: <A: true a 0.123 1234 asdf false> <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "iii": 6789, "sss": "redef"}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
+{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef"}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer"}, "aa": {"__kind": "ref", "__id": 1}}
 
 # Nit:
 <D: <B: <A: false b 123.123 2345 new line ->
 <- false> 1111         f"\r\/> true>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "iii": 6789, "sss": "redef", "ii": 1111, "ss": "\tf\"\r\\\/", "d": {"__kind": "ref", "__id": 0}}
+{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef", "ii": 1111, "ss": "\tf\"\r\\\/", "d": {"__kind": "ref", "__id": 0}}
 
index 88e1d45..b5ba7b5 100644 (file)
@@ -2,24 +2,24 @@
 <A: true a 0.123 1234 asdf false>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null}
+{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}
 
 # Nit:
 <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}
+{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}
 
 # Nit:
 <C: <A: true a 0.123 1234 asdf false> <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}, "aa": {"__kind": "ref", "__id": 1}}
+{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null]}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}, "aa": {"__kind": "ref", "__id": 1}}
 
 # Nit:
 <D: <B: <A: false b 123.123 2345 new line ->
 <- false> 1111         f"\r\/> true>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "ii": 1111, "ss": "\tf\"\r\\\/", "ffff": 6.789, "bbbb": false, "d": {"__kind": "ref", "__id": 0}}
+{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "array": [88, "hello", null], "ii": 1111, "ss": "\tf\"\r\\\/", "ffff": 6.789, "bbbb": false, "d": {"__kind": "ref", "__id": 0}}
 
index ae013db..806a0d2 100644 (file)
@@ -2,24 +2,24 @@
 <A: true a 0.123 1234 asdf false>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "iii": 6789, "sss": "redef"}
+{"__kind": "obj", "__id": 0, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef"}
 
 # Nit:
 <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}
+{"__kind": "obj", "__id": 0, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}
 
 # Nit:
 <C: <A: true a 0.123 1234 asdf false> <B: <A: false b 123.123 2345 hjkl false> 1111 qwer>>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "iii": 6789, "sss": "redef"}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}, "aa": {"__kind": "ref", "__id": 1}}
+{"__kind": "obj", "__id": 0, "__class": "C", "a": {"__kind": "obj", "__id": 1, "__class": "A", "b": true, "c": 'a', "f": 0.123, "i": 1234, "s": "asdf", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef"}, "b": {"__kind": "obj", "__id": 2, "__class": "B", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "hjkl", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef", "ii": 1111, "ss": "qwer", "ffff": 6.789, "bbbb": false}, "aa": {"__kind": "ref", "__id": 1}}
 
 # Nit:
 <D: <B: <A: false b 123.123 2345 new line ->
 <- false> 1111         f"\r\/> true>
 
 # Json:
-{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "iii": 6789, "sss": "redef", "ii": 1111, "ss": "\tf\"\r\\\/", "ffff": 6.789, "bbbb": false, "d": {"__kind": "ref", "__id": 0}}
+{"__kind": "obj", "__id": 0, "__class": "D", "b": false, "c": 'b', "f": 123.123, "i": 2345, "s": "new line ->\n<-", "n": null, "array": [88, "hello", null], "iii": 6789, "sss": "redef", "ii": 1111, "ss": "\tf\"\r\\\/", "ffff": 6.789, "bbbb": false, "d": {"__kind": "ref", "__id": 0}}
 
index e9c8bdd..f9ab65a 100644 (file)
@@ -12,6 +12,7 @@ class A
        var i: Int
        var s: String
        var n: nullable Int
+       var array: Array[nullable Object] = new Array[nullable Object].with_items(88, "hello", null)
 
        init(b: Bool, c: Char, f: Float, i: Int, s: String, n: nullable Int)
        do