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 ページのコードを確認してください。

コンテンツ ページ (content.aspx) をホストする IFrame を含む Web ページ (default.aspx)。

「Serialize Object」ボタンをクリックすると、JavaScript 関数 serializeObject() が呼び出されます。シリアル化は、上部ウィンドウ (フレームの外側) で作成された Array オブジェクトに対して正常に機能します。ただし、配列オブジェクトが IFrame で作成されている場合、シリアライゼーションはスタック領域不足エラーで爆撃します。ASP.Net AJAX JS ファイルを調べてみたところ、配列オブジェクトの型を特定しようとしてプロセスが無限ループに陥っていることがわかりました。Number.IsInstanceOf を無限に呼び出すと、すぐにスタック不足エラーが発生します。

何か案は?

4

3 に答える 3

2

この問題は、Sys.Serialization.JavaScriptSerializer が他のフレームからオブジェクトをシリアル化できず、現在のウィンドウでインスタンス化された (serialize() メソッドを呼び出す) オブジェクトのみがシリアル化できないために発生します。私が知っている唯一の回避策は、serialize() メソッドを呼び出す前に、他のフレームからオブジェクトのクローンを作成することです。

clone() メソッドの例 (ロシア語のコメント): link text

于 2010-04-01T15:26:21.493 に答える
1

あなたの例を一連の静的 html ファイルに変換し、スタンドアロンのMicrosoft Ajax Library 3.5をダウンロードしてテストしました。Firefox 3 でも IE 7 でも問題はありませんでしたが、最初の警告ボックスに [] (配列) と 2 番目の {} (オブジェクト) が表示されていることに気付きました。

次に、新しい 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 に答える