56 lines
2 KiB
TypeScript
56 lines
2 KiB
TypeScript
module SpaceTac.Game {
|
|
"use strict";
|
|
|
|
// Serializer to cascade through Serializable objects
|
|
export class Serializer {
|
|
collectSerializableClasses(container: any = null, path: string = ""): {[index: string]: typeof Serializable} {
|
|
if (container) {
|
|
var result: {[index: string]: typeof Serializable} = {};
|
|
for (var obj_name in container) {
|
|
if (obj_name) {
|
|
var obj = container[obj_name];
|
|
var obj_path = path + "." + obj_name;
|
|
if (typeof obj === "object") {
|
|
result = Tools.merge(result, this.collectSerializableClasses(obj, obj_path));
|
|
} else if (typeof obj === "function" && obj.prototype instanceof Serializable) {
|
|
result[obj_path] = obj;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
} else {
|
|
return this.collectSerializableClasses(SpaceTac.Game, "SpaceTac.Game");
|
|
}
|
|
}
|
|
|
|
getClassPath(obj: Serializable): string {
|
|
var classes = this.collectSerializableClasses();
|
|
for (var class_path in classes) {
|
|
if (class_path) {
|
|
var class_obj = classes[class_path];
|
|
if (class_obj.prototype === obj.constructor.prototype) {
|
|
return class_path;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
serialize(obj: Serializable): string {
|
|
var data = {
|
|
path: this.getClassPath(obj),
|
|
fields: obj
|
|
};
|
|
return JSON.stringify(data);
|
|
}
|
|
|
|
unserialize(sdata: string): Serializable {
|
|
var data = JSON.parse(sdata);
|
|
var class_info = this.collectSerializableClasses()[data.path];
|
|
var obj = Object.create(class_info.prototype);
|
|
obj = Tools.merge(obj, data.fields);
|
|
return obj;
|
|
}
|
|
}
|
|
}
|