オプション 2 が最適なオプションのように思えます。自分自身をシリアライズおよびデシリアライズする方法を知っているクラスのメソッドの標準セットと、グローバルなシリアライゼーション ヘルパーを確立すると、これを簡単に行うことができます。次のコードを検討してください。
逆シリアル化 = (関数() {
var レジストリ = {};
var デシリアライズ = 関数 (obj) {
var cls = obj['クラス'];
var data = obj['データ'];
var fn = レジストリ[cls];
fn(データ)を返します;
};
deserialize.registerClass(name, fn) {
レジストリ[名前] = fn;
};
逆シリアル化を返します。
});
そして、次のクラス:
/**
* 人物に関する情報
*/
var Person = function(firstName, lastName, age, phoneNumbers) {
this.firstName = firstName;
this.lastName = lastName;
this.age = 年齢;
this.phoneNumbers = phoneNumbers;
};
Person.serializeName = '人';
/**
* Person のインスタンスをシリアル化する
*/
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 のインスタンスをデシリアライズする
*/
Person.deserialize(データ) {
var phoneNumbers = data.phone_numbers.map(デシリアライズ);
return new Person(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 のインスタンスをデシリアライズする
*/
PhoneNumber.deserialize(データ) {
var phoneNumbers = data.phone_numbers.map(デシリアライズ);
新しい電話番号を返します (data.first_name, data.last_name, data.age, phoneNumbers);
};
deserialize.register(PhoneNumber.serializeName, PhoneNumber.deserialize);
繰り返しますが、データ チャンクを逆シリアル化するためのすべての情報はチャンクにあるため、データを に送信するdeserialize
と、何かのインスタンスが返されます。通常のコードと Webworker コードでクラスを再利用すると、最初に使用したインスタンスの同一のコピーが返されます。