diff --git a/src/scripts/game/Serializer.ts b/src/scripts/game/Serializer.ts index 83b7949..f15b96d 100644 --- a/src/scripts/game/Serializer.ts +++ b/src/scripts/game/Serializer.ts @@ -58,6 +58,15 @@ module SpaceTac.Game { var field_value = obj[field_name]; if (field_value instanceof Serializable) { fields[field_name] = this.toData(field_value); + } else if (Array.isArray(field_value) && field_value.length > 0 && field_value[0] instanceof Serializable) { + var items: Serializable[] = []; + field_value.forEach((item: any) => { + items.push(this.toData(item)); + }); + fields[field_name] = { + _s: "a", + items: items + }; } else { fields[field_name] = field_value; } @@ -65,6 +74,7 @@ module SpaceTac.Game { } var data = { + _s: "o", path: this.getClassPath(obj), fields: fields }; @@ -77,8 +87,14 @@ module SpaceTac.Game { for (var field_name in data.fields) { if (data.fields.hasOwnProperty(field_name)) { var field_value = data.fields[field_name]; - if (typeof field_value === "object" && field_value.hasOwnProperty("path")) { + if (typeof field_value === "object" && field_value._s === "o") { obj[field_name] = this.fromData(field_value); + } else if (typeof field_value === "object" && field_value._s === "a") { + var items: Serializable[] = []; + field_value.items.forEach((item: any) => { + items.push(this.fromData(item)); + }); + obj[field_name] = items; } else { obj[field_name] = field_value; } diff --git a/src/scripts/game/specs/Serializer.spec.ts b/src/scripts/game/specs/Serializer.spec.ts index 0b2e120..5c68590 100644 --- a/src/scripts/game/specs/Serializer.spec.ts +++ b/src/scripts/game/specs/Serializer.spec.ts @@ -22,10 +22,13 @@ module SpaceTac.Game.Specs { b: SerializableTestObj2; + c: SerializableTestObj2[]; + constructor(a: number = 5, b: SerializableTestObj2 = null) { super(); this.a = a; this.b = b; + this.c = []; } } @@ -59,11 +62,15 @@ module SpaceTac.Game.Specs { it("serializes and deserializes nested typescript objects", () => { var serializer = new Serializer(); var obj = new SerializableTestObj1(8, new SerializableTestObj2("test")); + obj.c.push(new SerializableTestObj2("second test")); + obj.c.push(new SerializableTestObj2("third test")); + var dumped = serializer.serialize(obj); var loaded = serializer.unserialize(dumped); expect(loaded).toEqual(obj); expect((loaded).b.prepend("this is a ")).toEqual("this is a test"); + expect((loaded).c[1].prepend("this is a ")).toEqual("this is a third test"); }); }); } diff --git a/src/scripts/view/specs/TestGame.ts b/src/scripts/view/specs/TestGame.ts index 9a375a4..9f9087d 100644 --- a/src/scripts/view/specs/TestGame.ts +++ b/src/scripts/view/specs/TestGame.ts @@ -1,4 +1,5 @@ /// +/// module SpaceTac.View.Specs { "use strict";