1

尝试序列化 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 页面的代码。

带有 IFrame 的网页 (default.aspx) 承载内容页 (content.aspx)。

单击“Serialize Object”按钮调用 JavaScript 函数 serializeObject()。序列化适用于在顶部窗口(框架外)中创建的 Array 对象。但是,如果在 IFrame 中创建数组对象,则序列化会出现堆栈空间不足的错误。我逐步浏览了 ASP.Net AJAX JS 文件,我发现,该过程进入了一个无限循环,试图找出数组对象的类型。无休止地调用 Number.IsInstanceOf 很快你就会得到一个堆栈外错误。

有任何想法吗?

4

3 回答 3

2

发生此问题是因为 Sys.Serialization.JavaScriptSerializer 无法序列化来自其他帧的对象,而只能序列化在当前窗口中实例化的那些对象(调用 serialize() 方法)。我知道的唯一解决方法是在调用 serialize() 方法之前从其他帧克隆对象。

您可以在此处找到 clone() 方法的示例(俄语评论): 链接文本

于 2010-04-01T15:26:21.493 回答
1

我将您的示例转换为一组静态 html 文件,并下载了独立的Microsoft Ajax Library 3.5进行测试。它在 Firefox 3 或 IE 7 上都没有问题,但我确实注意到第一个警告框显示 [](一个数组)和第二个 {}(一个对象)。

然后,我将您的新 Array() 代码转换为:

  var obj = [];
  obj.push(1);

之后,我得到 [1] 和 {"0", 1} 是警报框。我认为该错误与 JavaScriptSerializer 无关,而是与跨帧传递对象有关。

于 2008-10-11T16:05:17.257 回答
0

我现在无法测试您的代码,但对我来说它看起来像是 JavaScriptSerializer.serialize 中的一个错误。我的猜测是它试图通过 CLR 对数组进行某种类型检查,并且它不能正确处理空数组。

您是否尝试将可序列化类型的项添加到代码中的数组中?如果是这样,会发生什么?

于 2008-09-11T19:40:29.070 回答