문제

ASP.Net AJAX 배열 개체를 직렬화하는 동안 "스택 공간 부족" 오류가 발생했습니다.

단순화된 코드를 사용한 시나리오는 다음과 같습니다.

  1. Default.aspx

  2. 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);
    }
    
  3. Content.aspx

  4. 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을 통해 배열에 대한 일종의 유형 검사를 시도하고 빈 배열을 제대로 처리하지 못하는 것 같습니다.

코드의 배열에 직렬화 가능한 유형의 항목을 추가하려고 했습니까?그렇다면 어떻게 되나요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top