2010-08-16 56 views
2

我有我想在WCF暴露爲複雜類型的各種類,所以我添加[DataContract]和[數據成員]屬性作爲必要對這些類型和屬性。但是,如果我想讓它們從抽象基類繼承(例如,Person從抽象EntityBase繼承),則會出現類型「不能從未使用DataContractAttribute或SerializableAttribute標記的類型繼承」的錯誤。繼承在WCF抽象類不暴露該類

的問題是,如果我添加[DataContract]屬性基類,則該基類是通過WSDL暴露給客戶端。我猜想沒有什麼大不了的,但我更希望我的客戶不知道我的內部實現。

如果我將[Serializable]屬性添加到基類,它似乎首先工作(它可以序列化但EntityBase沒有在WSDL中引用),但現在如果我添加任何屬性到EntityBase那麼它也會抱怨它的屬性不可序列化。 (例如我添加一個ICollection,然後出現一個RuleViolation不可序列化的錯誤)。

不幸的似乎沒有模擬到[IgnoreDataMember]一種[序列化]類型([非序列化僅適用於字段,而不是屬性)。

所以基本上我想聲明這個基礎類型,但不需要任何成員被序列化;有什麼辦法可以在WCF中進行設置,因此客戶端看不到這種基本類型?

回答

1

你嘗試並不makring與DataContract和DataMember您的實體(以便默認序列化被使用)並用IgnoreDataMember標記基類屬性?

你總是有好幾種選擇,我affraid你不會喜歡任何人。

  • 創建一組DTO對象並將實體轉換爲DTO。一般來說,如果你想隱藏你的內部實現的最佳做法。
  • 創建suroggate類(實現IDataContractSuroggate)爲每個實體,讓你有過序列化的控制 - 我不知道這是否可以避免這個問題。
  • 升級到.NET 4.0,並使用EF與POCO類(無EntityBase父)

最好的問候,拉吉斯拉夫

+0

感謝Ladislav的建議。我應該提到我已經在使用EF4/POCO,EntityBase是我自己的,而不是EF的一部分。我沒有嘗試使用「默認」序列化,但我對它的「退出」類型模型並不滿意。你對使用DTO的可能性是正確的,但在這一點上,「問題」還不夠壞,不值得麻煩。 – 2010-08-17 12:28:42