Fixed serializer ID sequence not being reset on load
This commit is contained in:
parent
fcf696f7c1
commit
8b256aa95c
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue