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

wcf ilist序列化问题

  •  6
  • Nick  · 技术社区  · 15 年前

    我有一个对象,其中包含一个从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();
    

    当我在服务上调用这个方法时,它会很好地执行整个方法,但最后它抛出了一个没有innerException的System.ExecutionEngineeException。我尝试返回一个具体的列表对象,这似乎有效,但不幸的是,我需要找到一个解决方法来返回一个IList。我需要加入一些属性来解决这个问题吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Boris Modylevsky    15 年前

    对于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

        2
  •  1
  •   Steve    15 年前

    我觉得你做不到。序列化程序如何知道要对什么进行沙漠化?很多事情都可以实现IList,而接口没有构造函数。

        3
  •  1
  •   Mas    15 年前

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

    总结:
    -将包含数据合同的程序集放入GAC。
    -将loaderoptimization设置为singledomain。

        4
  •  0
  •   BennyM    15 年前

    从pageableresults继承以生成一个封闭的泛型子类(在您的情况下为pageablecontentitem或类似的子类),并将其用作返回类型。对于WebServices,通常使用XML序列化程序,它需要提前了解所有信息,这就是为什么您不能返回接口类型的原因。

        public class PageableContentItem
            : PageableResults<ContentItem>
        {
    
        }
    
    [OperationContract]
    PageableContentItem ListCI();