2013-03-14 2 views
1

웹 작업자의 'postMessage'와 함께 보내는 객체의 직렬화는 JSON.serialize와 JSON.parse의 비 직렬화로 이루어진 것으로 생각했습니다. 하지만 그 노동자 코드 (파이어 폭스)에서 시험을했다 : 주 파일 지금웹 작업자의 데이터 게시 후 참조

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를 사용할 때 참조가 없습니다 ... 그러면 직렬화가 어떻게 이루어 집니까? 모든 브라우저에서 해당 참조를 사용할 수 있습니까? 감사합니다.

답변

2

아니요, 작업자 통신은 JSON을 직렬화에 사용하지 않습니다. 수동으로 할 수도 있고 문자열을 전달할 수도 있지만 그렇게 할 필요는 없습니다.

MDN states

: 메인 페이지와 근로자 사이에 전달

메시지는 공유하지 복사됩니다. 객체는 작업자에게 건네 짐과 동시에 직렬화되어 다른 끝에서 비 직렬화됩니다. 페이지와 작업자는 동일한 인스턴스를 공유하지 않으므로 최종 결과는 각 끝에 중복이 만들어집니다. 대부분의 브라우저는이 기능을 structured cloning으로 구현합니다. 사실

Worker spec for postMessage는 인수가 기본이 MessagePortpostMessage에 전달하고, that one is specifiedmessage 인수에 structured cloning algorithm를 사용하는 것을 말한다.

관련 문제