Ошибка переполнения стека при сериализации массива в ASP.Net AJAX

Проблема с сериализацией объектов JavaScript в ASP.Net AJAX

Столкнулся с ошибкой “Переполнение стека” при попытке сериализовать массив через ASP.Net AJAX. Проблема возникает в специфичной ситуации с фреймами.

Описание ситуации

У меня есть главная страница с iframe внутри. В главном окне создается функция для получения массива, а в iframe вызывается сериализация.

// Код в основном окне (main.js)
function createNewArray(){
    return new Array();
}

function serializeData(data){
    var result = Sys.Serialization.JavaScriptSerializer.serialize(data);
    alert(result);
}

function processArray(){
    var data = createNewArray();
    var result = Sys.Serialization.JavaScriptSerializer.serialize(data);
    alert(result);
}
// Код во фрейме (frame.js)
function handleSerialization(){
    var data = window.parent.createNewArray();
    window.parent.serializeData(data); // Работает нормально

    data = new Array();
    window.parent.serializeData(data); // Вызывает ошибку переполнения стека
}

Суть проблемы

Когда массив создается в родительском окне, сериализация проходит успешно. Но если тот же массив создается внутри iframe и передается в родительское окно для сериализации, возникает бесконечный цикл.

При отладке заметил, что процесс зацикливается на определении типа массива, постоянно вызывая Number.IsInstanceOf, что в итоге приводит к переполнению стека.

Кто-нибудь сталкивался с подобной проблемой? Есть ли способы обойти это ограничение?

Классическая проблема с кросс-фреймами. Массив из iframe живет в другом контексте и у него другой прототип Array. ASP.Net AJAX проверяет тип через instanceof, а массив из чужого окна эту проверку не пройдет.

Попробуй создать новый массив в родительском окне с помощью var newData = window.parent.Array.prototype.slice.call(data), или перегони данные через JSON: JSON.stringify(data) перед сериализацией. Это поможет пересоздать объект в нужном контексте.

Да, та же проблема была. Каждый фрейм создает свой объект Array. Сделай новый массив в родительском окне и скопируй элементы из iframe: var parentArray = []; for(var i=0; i<data.length; i++) parentArray[i] = data[i];. Потом сериализуй parentArray.