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 beta 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 的情况如何。我必须递归转换所有 IEnumerables 的整个对象图是不可接受的。

我看不出 DataContractSerializer 不能迭代任何 IEnumerable 类型并将其元素以与任何其他集合类型相同的方式呈现为 XML 的任何充分理由,即使 IEnumerable 没有具体的支持类型。

这是一个应该修复的错误。

于 2010-04-27T05:36:11.987 回答