代码之家  ›  专栏  ›  技术社区  ›  Jim

使用带Webget的IEnumerable<t>序列化数据

  •  3
  • Jim  · 技术社区  · 15 年前

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


    你好,

    如果我的方法符号看起来像这样,它就可以工作。

    [WebGet]
    MyClass[] WebMethod()
    

    如果招牌看起来像这样

    [WebGet]
    IEnumerable<T> WebMethod()
    

    我得到以下错误: 无法序列化类型为“x.y.z.t+<webmethod>d_u2c”(用于操作“webmethod”,协定“iservice”)的参数,因为它不是方法签名中的确切类型“system.collections.generic.ienumerable“1[x.y.z.t]”,并且不在已知类型集合中。为了序列化参数,请使用ServiceKnownTypeAttribute将类型添加到操作的已知类型集合中。

    我尝试过添加。 服务知识类型(typeof(ienumerable))

    同样的错误。

    这是2010年测试版2的一个bug,还是在将来可能是正确的?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  7
  •   SLaks    15 年前

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

    如果你读 this page ,您将看到序列化迭代器是没有意义的。

    您需要返回一个数组。

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

    [WebGet]
    MyClass[] WebMethod() { return OtherMethod().ToArray(); }
    
        2
  •  1
  •   Jim    15 年前

    我遇到了同样的问题,在我的例子中,根本不可能将整个对象图从基于迭代器的IEnumerable更改为具体的类型。我根本负担不起将内存转换为具体的类型,如列表或数组。另外,如果返回某个具有IEnumerable属性的对象的IEnumerable,该怎么办?不可接受的是,我必须重复使用整个对象图来转换所有IEnumerable。

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

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

    推荐文章