选项 2 听起来是最好的选择。如果你在你的类上建立一个知道如何序列化和反序列化自己的标准方法集,以及一个全局序列化助手,你可以让这件事变得简单。考虑以下代码:
反序列化 = (function() {
var 注册表 = {};
var 反序列化 = 函数(obj){
var cls = obj['class'];
var 数据 = obj['data'];
var fn = 注册表[cls];
返回 fn(数据);
};
反序列化.registerClass(名称,fn){
注册表[名称] = fn;
};
返回反序列化;
});
以及以下课程:
/**
* 关于一个人的信息
*/
var Person = function(firstName, lastName, age, phoneNumbers) {
this.firstName = 名字;
this.lastName = 姓氏;
this.age = 年龄;
this.phoneNumbers = phoneNumbers;
};
Person.serializeName = '人';
/**
* 序列化一个人的实例
*/
Person.prototype.serialize = function() {
返回 {
“类”:Person.serializeName,
'数据': {
'first_name': this.firstName,
'last_name', this.lastName,
'年龄': this.age,
'phone_numbers': this.phone_numbers.map(function(number) { return number.serialize(); })
}
};
}
/**
* 反序列化一个人的实例
*/
Person.deserialize(数据) {
var phoneNumbers = data.phone_numbers.map(反序列化);
返回新人(data.first_name,data.last_name,data.age,phoneNumbers);
};
deserialize.register(Person.serializeName, Person.deserialize);
您可以使用 序列化任何 Person 实例data = person.serialize();
,将其发送给您的工作人员,并使用反序列化它以person = deserialize(data);
序列化格式生成数据的任何内容都是可反序列化的,并且在反序列化之前您不必知道它是哪种类 - 携带类型连同数据。嵌套数据类型也是可能的,如person.phoneNumbers
. PhoneNumber 类的实现可能是:
/*
* 电话号码
*/
var PhoneNumber = function(number, numberType) {
this.number = 数字;
this.numberType = numberType;
}
PhoneNumber.prototype.serializeName = 'PhoneNumber';
/**
* 序列化一个电话号码的实例
*/
PhoneNumber.prototype.serialize = function() {
返回 {
“类”:PhoneNumber.serializeName,
'数据': {
'数字':this.number,
'number_type': this.numberType,
}
};
}
/**
* 反序列化一个电话号码的实例
*/
PhoneNumber.deserialize(数据) {
var phoneNumbers = data.phone_numbers.map(反序列化);
return new PhoneNumber(data.first_name, data.last_name, data.age, phoneNumbers);
};
deserialize.register(PhoneNumber.serializeName, PhoneNumber.deserialize);
同样,用于反序列化数据块的所有信息都在该块中,因此将数据发送到deserialize
将给您返回某个实例。如果您在普通代码和 webworker 代码中重复使用您的类,您将获得与您开始使用的实例相同的副本。