1

Web Worker から「postMessage」で送信するオブジェクトのシリアライズは JSON.serialize で、デシリアライズは JSON.parse でできると思いました。しかし、そのワーカー コードを使用して (Firefox で) テストを行いました。

function A() {
    this.id = 3;
    this.save;
}

var a1 = new A();
var a2 = new A();

a1.save = a2;

postMessage({
    'a1' : a1,
    'a2' : a2    
});

メインファイルには次のものがあります。

w.onmessage = function(event) {
    event.data.a2.id = 7;
};

その後、a1.save.id の値も 7 になっています。したがって、参照が必要ですが、 JSON.serialze と JSON.parse を使用すると参照がありません...では、シリアル化はどのように行われますか? すべてのブラウザでその参照を想定できますか? ありがとう!

4

1 に答える 1

2

いいえ、ワーカー通信はシリアル化に JSON を使用しません。手動で文字列を渡すこともできますが、その必要はありません。

MDN の状態:

メイン ページとワーカーの間で渡されるメッセージは、共有ではなくコピーされます。オブジェクトはワーカーに渡されるときにシリアル化され、その後反対側で逆シリアル化されます。ページとワーカーは同じインスタンスを共有しないため、最終的には両端に複製が作成されます。ほとんどのブラウザーは、この機能を構造化クローンとして実装しています。

実際、Worker の仕様でpostMessageMessagePortは、引数が基になるのに渡され、引数で構造化されたクローン作成アルゴリズムを使用するように指定されpostMessageていると述べています。message

于 2013-03-14T16:57:37.257 に答える