4

オブジェクトをシリアル化しようとすると、次のSerializationExceptionがスローされます。

アセンブリ'System.Core、Version = 4.0.0.0、Culture=に'System.Linq.Enumerable + d__71`1 [[System.String、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089]]'と入力します。ニュートラル、PublicKeyToken =b77a5c561934e089'はシリアル化可能としてマークされていません。

このオブジェクトは私のコードのどこにありますか?どうすればわかりますか?オブジェクトグラフはかなり大きいです。

4

3 に答える 3

4

d__71`1Reflectorを使用してみて、コード内で匿名タイプが使用されている場所を特定できるかどうかを確認してください。

于 2011-03-16T02:33:11.060 に答える
4

結果をリストに変換せずに列挙子メソッドを呼び出した結果を保存したように私には聞こえます。

このような方法がある場合:

public IEnumerable<string> GetMyWidgetNames()
{
    foreach (var x in MyWidgets)
    { 
        yield return x.Name;
    }
}

コンパイラはこれを、表示されているような名前のネストされたオブジェクトに変換します(埋め込まれているために自分で作成できない名前のオブジェクト+

次に、このオブジェクトへの参照をシリアル化しようとするものの中に格納すると、OPによって示される例外が発生します。

「修正」は、シリアル化されたオブジェクトが常にIEnumerable<>割り当てをリストに変換するようにすることです。これの代わりに

public IEnumerable<string> WidgetNames { get; set; }

あなたは書く必要があります:

public IEnumerable<string> WidgetNames
{
    get { return mWidgetNames; }
    set
    {
        if (value == null)
            mWidgetNames= null
        else mWidgetNames= value.ToList();
    }
}
private List<string> mWidgetNames;
于 2011-03-16T03:01:23.280 に答える
-1

オブジェクト(単一タイプ)を一度にシリアル化して、いつ爆発するかを確認してください。これは手動で、またはリフレクションを介して行うことができます。

于 2011-03-16T02:33:35.400 に答える