ASP.Net AJAX JavaScript 직렬화 오류
-
09-06-2019 - |
문제
ASP.Net AJAX 배열 개체를 직렬화하는 동안 "스택 공간 부족" 오류가 발생했습니다.
단순화된 코드를 사용한 시나리오는 다음과 같습니다.
Default.aspx
MainScript.js
function getObject(){ return new Array(); } function function1(obj){ var s=Sys.Serialization.JavaScriptSerializer.serialize(obj); alert(s); } function function2(){ var obj=getObject(); var s=Sys.Serialization.JavaScriptSerializer.serialize(obj); alert(s); }
Content.aspx
ContentScript.js
function serializeObject(){ var obj=window.top.getObject(); window.top.function1(obj); // <– This works fine obj=new Array(); window.top.function1(obj); // <– this causes an Out of Stack Space error }
샘플 페이지 및 JavaScript의 코드는 다음과 같습니다. 여기.
여기에 aspx 페이지의 코드를 게시하면 문제가 발생했습니다.따라서 aspx 페이지의 코드를 보려면 위 링크를 확인하세요.
콘텐츠 페이지(content.aspx)를 호스팅하는 IFrame이 있는 웹 페이지(default.aspx)입니다.
"Serialize Object" 버튼을 클릭하면 JavaScript 함수 serializeObject()가 호출됩니다.직렬화는 상단 창(프레임 외부)에서 생성된 Array 객체에 대해 잘 작동합니다.그러나 IFrame에서 배열 객체가 생성되면 직렬화는 스택 공간 부족 오류로 인해 폭탄을 터뜨립니다.ASP.Net AJAX JS 파일을 살펴보았는데 프로세스가 배열 개체의 유형을 알아내려고 끝없는 루프에 빠진다는 사실을 발견했습니다.Number.IsInstanceOf에 대한 끝없는 호출과 곧 스택 부족 오류가 발생합니다.
어떤 아이디어가 있나요?
해결책
이 문제는 Sys.Serialization.JavaScriptSerializer가 다른 프레임의 개체를 직렬화할 수 없고 현재 창(serialize() 메서드 호출)에서 인스턴스화된 개체만 직렬화할 수 있기 때문에 발생합니다.나에게 알려진 유일한 해결 방법은 serialize() 메서드를 호출하기 전에 다른 프레임에서 개체를 복제하는 것입니다.
여기에서 찾을 수 있는 clone() 메소드의 예(러시아어 주석):링크 텍스트
다른 팁
귀하의 예제를 정적 HTML 파일 세트로 변환하고 독립 실행형 파일을 다운로드했습니다. 마이크로소프트 아약스 라이브러리 3.5 테스트합니다.Firefox 3이나 IE 7에서는 문제가 없었지만 첫 번째 경고 상자에 [](배열)과 두 번째 {}(객체)가 표시되는 것을 확인했습니다.
그런 다음 새 Array() 코드를 다음과 같이 변환했습니다.
var obj = [];
obj.push(1);
그 후에는 [1]을 얻었고 {"0", 1}은 경고 상자입니다.버그가 JavaScriptSerializer에 있다고 생각하지 않지만 프레임 간에 객체를 전달하는 것과 관련이 있습니다.
지금은 귀하의 코드를 테스트할 방법이 없지만 JavaScriptSerializer.serialize의 버그처럼 보입니다.내 생각에는 CLR을 통해 배열에 대한 일종의 유형 검사를 시도하고 빈 배열을 제대로 처리하지 못하는 것 같습니다.
코드의 배열에 직렬화 가능한 유형의 항목을 추가하려고 했습니까?그렇다면 어떻게 되나요?