使用IEnumerable <t>使用WebGet </t>序列化数据

时间:2010-01-20 16:27:03

标签: ienumerable serialization webget

  

可能重复:
  Cannot serialize parameter of type ‘System.Linq.Enumerable… ’ when using WCF, LINQ, JSON


您好,

如果我的方法签名看起来像这样,它可以正常工作。

[WebGet]
MyClass[] WebMethod()

如果签名看起来像这样

[WebGet]
IEnumerable<T> WebMethod()

我收到以下错误: 无法序列化'XYZT +&lt; WebMethod&gt; d__2c'类型的参数(对于操作'WebMethod',合同'IService'),因为它不是确切的类型'System.Collections.Generic.IEnumerable`1 [XYZT]'方法签名,不在已知类型集合中。要序列化参数,请使用ServiceKnownTypeAttribute将类型添加到操作的已知类型集合中。

我尝试过添加。 ServiceKnownType(typeof运算(IEnumerable的))

同样的错误。

这是2010年测试版2中的错误,或者这可能是正确的吗?

由于

2 个答案:

答案 0 :(得分:7)

C#编译器生成的迭代器类型不可序列化,永远不会。

如果您阅读this page,您会发现序列化迭代器是没有意义的。

你需要返回一个数组。

编辑:最简单的方法是将迭代器移动到单独的方法,然后将WebMethod更改为

[WebGet]
MyClass[] WebMethod() { return OtherMethod().ToArray(); }

答案 1 :(得分:1)

我遇到了同样的问题,在我的情况下,根本无法将我的整个对象图从基于迭代器的IEnumerable更改为具体类型。我根本无法承受内存转换为List或Array等具体类型。另外,我返回一个具有IEnumerable属性的对象的IEnumerable的情况如何呢。我必须递归我的整个对象图转换所有IEnumerables是不可接受的。

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

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