2011-10-05 119 views
1

我有一個相當棘手的問題,在過去兩天裏一直困擾着我。Webservice序列化IEnumerable屬性

這是我的課:

public class MyClass: BaseEntity<int> 
    { 
     //Some other properties here... 

     public virtual Categorie Categorie { get; set; } 
     public virtual Bron Bron { get; set; } 
     public virtual IEnumerable<Label> Labels { get; set; } 
    } 

我被迫使用NHibernate的。因此,我已完成映射並且IEnumerable不能是List<T>(它可以是IList<T>)。但是當你打電話給我的webservice時,它不能序列化我的IEnumerable,因爲它是一個接口,IList也是這樣。因爲我使用nhibernate,所以我無法改變我的班級佈局,據我所知。

所以我的問題基本上是: 我可以告訴串行器,它應該威脅它作爲一個列表?還是有一個通用的集合類,將序列化標籤,不會使nhibernate生氣?或者其他任何可以工作的東西?

+1

你正在使用什麼樣的序列化? – svick

回答

2

不完全回答你的問題,但也許回答您的問題:)

跨進程邊界發送實體是不是一個很好的主意。您應該將您的實體投影到DTO併發送這些實體。

如果您在您的服務合同中公開您的實體結構,那麼您的實體會與您服務的每個消費者(壞)耦合。如果用簡單的DTO定義服務合同,消費者將只依賴他們而不是你的實體(良好)。

實體對DTO的投影也​​可以自動完成(使用automapper)。

此外,您還可以避免一些與延遲加載實體相關的其他問題。

如果您仍然希望通過線路發送實體,那麼您可能會將IEnumerable屬性標記爲不可序列化,並使用只返回IEnumerable Property.ToArray()的數組類型的另一個屬性,而不要在NHibernate中映射數組屬性。