簡體   English   中英

從WCF中的抽象類繼承而無需暴露該類

[英]Inherit from abstract class in WCF without exposing that class

我想將各種類公開為WCF中的“復雜類型”,因此我根據需要在這些類型和屬性上添加了[DataContract]和[DataMember]屬性。

但是,如果我想讓它們從抽象基類繼承(例如,Person從抽象EntityBase繼承),則會收到錯誤消息,指出類型“無法從未標記有DataContractAttribute或SerializableAttribute的類型繼承”。

問題是,如果我將[DataContract]屬性添加到基類,則該基類將通過WSDL向客戶端公開。 我猜這沒什么大不了的,但是我希望我的客戶不了解我的內部實現。

如果我將[Serializable]屬性添加到基類,那么它似乎一開始就可以工作(可以序列化,但是WSDL中未引用EntityBase),但是現在,如果我將任何屬性添加到EntityBase,那么它也會抱怨其屬性不可序列化。 (例如,我添加了一個ICollection,然后我收到一個RuleViolation無法序列化的錯誤)。

不幸的是,[Serializable]類型似乎沒有類似於[IgnoreDataMember]的類型([NonSerialized僅適用於字段,不適用於屬性)。

因此,基本上我想聲明此基本類型,但不需要任何其成員進行序列化; 有什么方法可以在WCF中進行設置,以便客戶端看不到該基本類型?

您是否嘗試過根本不使用[DataContract][DataMember]標記您的實體(以便使用默認序列化),而是使用[IgnoreDataMember]標記基類屬性?

您總是有幾種選擇,恐怕您不會喜歡其中任何一種。

  • 創建一組DTO對象並將實體轉換為DTO。 如果要隱藏內部實現,通常這是最佳做法。
  • 為每個實體創建一個代理類(實現IDataContractSuroggate),以便您可以控制序列化-我不確定這是否可以避免問題。
  • 升級到.NET 4.0並在POCO類中使用EF(沒有EntityBase作為父類)

最好的問候,拉迪斯拉夫

我認為您必須使用KnownType屬性。 例如,請參見帶有KnownType for Dictionary的WCF問題

[編輯]可以在這里找到關於此問題及其解決方案的更完整討論: WCF:接口,泛型和ServiceKnownType

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM