質問

私はオブジェクトをシリアル化しようとしていますが、次のシリアル化エクセプトがスローされます。

タイプ 'System.linq.Numerable+D__71`1 [[System.String、Mscorlib、version = 4.0.0.0、Culture = neutral、publicKeyToken = B77A5C561934E089]] Neutral、publicKeyToken = B77A5C561934E089 'は、シリアル化可能としてマークされていません。

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

役に立ちましたか?

解決

リフレクターを使用してみて、匿名タイプを決定できるかどうかを確認してください d__71`1 コードで使用されています。

他のヒント

結果をリストに変換せずに、列挙者メソッドを呼び出す結果を保存しているかのように私に聞こえます。

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

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

コンパイラは、これを見ているような名前のネストされたオブジェクトに変えます(埋め込まれたために自分自身を作成することができない名前の名前があります +)

その後、このオブジェクトへの参照をシリアル化しようとするものの中に保存すると、OPで記載されている例外が得られます。

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

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;

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top