1
0
Fork 0

Fixed serializer ID sequence not being reset on load

This commit is contained in:
Michaël Lemaire 2015-03-12 01:00:00 +01:00
parent fcf696f7c1
commit 8b256aa95c
3 changed files with 44 additions and 1 deletions

View file

@ -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) {

View file

@ -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 {

View file

@ -112,5 +112,30 @@ module SpaceTac.Game.Specs {
expect((<SerializableTestObj1>loaded).b.b.a).toBe(true);
expect((<SerializableTestObj1>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 = <SerializableTestObj1>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);
});
});
}