2009-08-18 61 views
6

我已經有一個通用的IList它正從一個WCF Web服務方法返回一個對象:WCF 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.ExecutionEngineException。我試過返回一個具體的列表<>對象,這似乎工作,但不幸的是我需要找到一個解決方法來返回一個IList。我需要解決這個問題嗎?

+0

你說「當我打電話的服務這種方法」 - 反序列化的結果時是誤差居然? – 2009-08-18 20:55:14

+0

我認爲它發生在服務端,因爲它會在我退出服務方法時拋出正確的對象,但在異常中沒有堆棧跟蹤,所以我不能肯定。 – Nick 2009-08-18 21:45:15

回答

1

你必須添加KnownTypes屬性的類定義類定義上面T.每次使用像這樣:


[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

1

我不認爲你可以這樣做。序列化程序如何知道要刪除的內容?許多事情可以實現一個IList,而一個接口沒有構造函數。

+0

它使用netTcpBinding時似乎工作正常,但不與WSHttpBinding – Nick 2009-08-18 19:32:52

+0

什麼是反序列化的底層類型呢?我不明白這是如何工作的,除非它隨機挑選一個實現IList的容器並將它們粘在那裏。 – Steve 2009-08-18 19:55:11

0

從PageableResults繼承來創建一個封閉的泛型子類,在你的情況下PageableContentItem或類似的東西,並使用它作爲返回類型。對於webservices,通常使用xml序列化器,它需要事先知道所有事情,這就是爲什麼你不能返回接口類型的原因。

public class PageableContentItem 
     : PageableResults<ContentItem> 
    { 

    } 

[OperationContract] 
PageableContentItem ListCI();