Вопрос

При попытке сериализации объекта массива AJAX ASP.Net возникла ошибка «Недостаточно места в стеке».

Вот сценарий с упрощенным кодом:

  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.

Веб-страница (default.aspx) с IFrame, на которой размещена страница содержимого (content.aspx).

Нажатие кнопки «Сериализовать объект» вызывает функцию JavaScript SerializeObject().Сериализация отлично работает для объектов Array, созданных в верхнем окне (вне фрейма).Однако, если объект массива создается в IFrame, сериализация завершается с ошибкой нехватки места в стеке.Я просмотрел JS-файлы ASP.Net AJAX и обнаружил, что процесс переходит в бесконечный цикл, пытаясь определить тип объекта массива.Бесконечный вызов Number.IsInstanceOf, и довольно скоро вы получите ошибку отсутствия стека.

Есть идеи?

Это было полезно?

Решение

Эта проблема возникает из-за того, что Sys.Serialization.JavaScriptSerializer не может сериализовать объекты из других кадров, а только те объекты, экземпляры которых были созданы в текущем окне (который вызывает метод сериализации()).Единственный известный мне обходной путь - это создание клона объекта из другого кадра перед вызовом метода сериализации().

Пример метода clone() вы можете найти здесь (комментарии на русском языке):текст ссылки

Другие советы

Я преобразовал ваш пример в набор статических html-файлов и загрузил автономный файл. Библиотека Microsoft Ajax 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