3

重複の可能性:
WCF、LINQ、JSON を使用している場合、タイプ 'System.Linq.Enumerable…' のパラメーターをシリアル化できません


やあ、

私のメソッド シグネチャがこのように見える場合、正常に動作します。

[WebGet]
MyClass[] WebMethod()

署名がこのように見える場合

[WebGet]
IEnumerable<T> WebMethod()

次のエラーが表示されます: タイプ 'XYZT+<WebMethod>d__2c' (オペレーション 'WebMethod'、コントラクト 'IService') のパラメーターをシリアル化できません。正確なタイプ 'System.Collections.Generic.IEnumerable`1[XYZT] ではないためです。 ' メソッド シグネチャにあり、既知の型のコレクションにはありません。パラメーターをシリアル化するには、ServiceKnownTypeAttribute を使用して、操作の既知の型のコレクションに型を追加します。

追加してみました。ServiceKnownType(typeof(IEnumerable))

同じエラー。

これは 2010 ベータ 2 のバグですか、それとも今後も正しいと思われますか?

ありがとう

4

2 に答える 2

7

C# コンパイラによって生成された反復子の型はシリアル化できず、今後もできません。

このページを読むと、イテレータをシリアライズする意味がないことがわかります。

配列を返す必要があります。

編集:これを行う最も簡単な方法は、イテレータを別のメソッドに移動し、次のように変更WebMethodすることです

[WebGet]
MyClass[] WebMethod() { return OtherMethod().ToArray(); }
于 2010-01-20T16:28:23.540 に答える
1

私は同じ問題に遭遇しました。私の場合、オブジェクト グラフ全体を反復子ベースの IEnumerable から具体的な型に変更することはできません。List や Array などの具体的な型に変換するためのメモリを確保する余裕がありません。さらに、IEnumerable プロパティを持つオブジェクトの IEnumerable を返す場合はどうでしょうか。すべての IEnumerable を変換するオブジェクト グラフ全体を再帰する必要があることは容認できません。

IEnumerable に具体的なバッキング型がない場合でも、DataContractSerializer が IEnumerable 型を反復処理して、その要素を他のコレクション型と同じ方法で XML にレンダリングできない理由がわかりません。

これは修正すべきバグです。

于 2010-04-27T05:36:11.987 に答える