From 8b256aa95c16746248e7d4ef5f832361c77e7f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Thu, 12 Mar 2015 01:00:00 +0100 Subject: [PATCH] Fixed serializer ID sequence not being reset on load --- src/scripts/game/Serializable.ts | 5 +++++ src/scripts/game/Serializer.ts | 15 +++++++++++++- src/scripts/game/specs/Serializer.spec.ts | 25 +++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/scripts/game/Serializable.ts b/src/scripts/game/Serializable.ts index 253a34d..af3e1fc 100644 --- a/src/scripts/game/Serializable.ts +++ b/src/scripts/game/Serializable.ts @@ -11,6 +11,11 @@ module SpaceTac.Game { this._sid = null; } + // Reset the SID sequence, given a maximal known SID + static resetIdSequence(highest_known: number): void { + Serializable._next_sid = highest_known + 1; + } + // Get an ID that can be used for serialization getSerializeId(): string { if (this._sid === null) { diff --git a/src/scripts/game/Serializer.ts b/src/scripts/game/Serializer.ts index efc0f9a..01a0c58 100644 --- a/src/scripts/game/Serializer.ts +++ b/src/scripts/game/Serializer.ts @@ -48,6 +48,17 @@ module SpaceTac.Game { return null; } + // Compute the highest known SID + getMaxId(): number { + var result = -1; + for (var sid in this.refs) { + if (typeof sid === "string") { + result = Math.max(result, parseInt(sid, 10)); + } + } + return result; + } + // Serialize an object to a string serialize(obj: Serializable): string { this.refs = {}; @@ -62,7 +73,9 @@ module SpaceTac.Game { unserialize(sdata: string): Serializable { var data = JSON.parse(sdata); this.refs = data.refs; - return this.fromData(data.root); + var result = this.fromData(data.root); + Serializable.resetIdSequence(this.getMaxId()); + return result; } private toData(obj: Serializable): any { diff --git a/src/scripts/game/specs/Serializer.spec.ts b/src/scripts/game/specs/Serializer.spec.ts index 493877c..0394608 100644 --- a/src/scripts/game/specs/Serializer.spec.ts +++ b/src/scripts/game/specs/Serializer.spec.ts @@ -112,5 +112,30 @@ module SpaceTac.Game.Specs { expect((loaded).b.b.a).toBe(true); expect((loaded).b.b.b).toBe(loaded); }); + + it("resets id sequence between sessions", () => { + // Start with a fresh ID sequence + Serializable._next_sid = 0; + + var serializer = new Serializer(); + + // Serialize an object + var obj1 = new SerializableTestObj1(8); + var dumped = serializer.serialize(obj1); + + // Simulate a page refresh + Serializable._next_sid = 0; + + // Load dumped object + var loaded = serializer.unserialize(dumped); + + // Add a new object + loaded.b = new SerializableTestObj2("test"); + + // If the ID sequence is not propertly reset, the ID of both objects will clash + dumped = serializer.serialize(loaded); + var loaded_again = serializer.unserialize(dumped); + expect(loaded_again).toEqual(loaded); + }); }); }