WCF IList序列化问题

时间:2009-08-18 15:16:43

标签: c# wcf web-services

我有一个对象,其中包含从WCF Web服务方法返回的通用IList:

[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T>
{
    [DataMember]
    public IList<T> Items { get; set; }
    [DataMember]
    public int TotalRows { get; set; }
}

[OperationContract]
PageableResults<ContentItem> ListCI();

当我在服务上调用此方法时,它会很好地执行整个方法,但最后会抛出System.ExecutionEngineException而不会发生InnerException。我已经尝试返回一个具体的List&lt;&gt;对象,这似乎工作,但不幸的是我需要找到一个解决方法来返回IList。我需要提出任何属性来解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

我认为你不能这样做。序列化器如何知道要去哪个desearialize?很多东西都可以实现IList,而接口没有构造函数。

答案 1 :(得分:1)

这似乎是WCF中的一个错误,它在.NET 4中得到修复。但是,此主题中列出了几种解决方法:
http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=433569

摘要:
  - 将包含DataContracts的程序集放入GAC   - 将LoaderOptimization设置为SingleDomain。

答案 2 :(得分:1)

对于T的每个用法,您必须在类定义上方的类定义中添加KnownTypes属性。如下所示:


[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T>
{
    [DataMember]
    public IList<T> Items { get; set; }
    [DataMember]
    public int TotalRows { get; set; }
}

[OperationContract]
PageableResults ListCI();

或者,您可以定义自己的集合类,它具有TotalRows属性,如下所示:


[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T> : EntityCollectionWorkaround<T>
{   
    [DataMember]
    public int TotalRows { get; set; }
}

这里定义了EntityCollectionWorkaround:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

答案 3 :(得分:0)

继承自PageableResults以创建一个封闭的泛型子类,在您的情况下是PageableContentItem或类似的东西,并将其用作返回类型。对于webservices,通常使用xml序列化程序,它需要事先知道所有内容,这就是为什么你也不能返回接口类型。

    public class PageableContentItem
        : PageableResults<ContentItem>
    {

    }

[OperationContract]
PageableContentItem ListCI();