从WCF中的抽象类继承而不暴露该类

时间:2010-08-16 20:13:27

标签: c# wcf serialization

我想在WCF中将各种类公开为复杂类型,因此我根据需要在这些类型和属性上添加[DataContract]和[DataMember]属性。

但是,如果我想让它们从抽象基类继承(例如Person继承自抽象EntityBase),我会收到一个错误,即“无法从未标记为DataContractAttribute或SerializableAttribute的类型继承”。< / p>

问题是,如果我将[DataContract]属性添加到基类,那么该基类将通过WSDL向客户端公开。我想这不是什么大不了的事,但我更希望我的客户不知道我的内部实现。

如果我将[Serializable]属性添加到基类,那么它似乎首先工作(它可以被序列化但是在WSDL中没有引用EntityBase),但现在如果我向EntityBase添加任何属性,那么它将还抱怨它的属性不可序列化。 (例如,我添加了一个ICollection,然后我收到一条错误,即RuleViolation不可序列化。)

不幸的是,[Serializable]类型的[IgnoreDataMember]似乎没有类似物([NonSerialized仅适用于字段,而不适用于属性)。

所以基本上我想声明这个基类型,但不需要序列化它的任何成员;有没有办法在WCF中设置它,以便客户端看不到这种基类型?

2 个答案:

答案 0 :(得分:1)

您是否尝试过根据[DataContract][DataMember]标记实体(以便使用默认序列化),而是使用[IgnoreDataMember]标记基类属性?

你总是有几个选择,我担心你不会喜欢他们中的任何一个。

  • 创建一组DTO对象并将实体转换为DTO。如果您想要隐藏内部实现,这通常是最佳实践。
  • 为每个实体创建一个代理类(实现IDataContractSuroggate),以便您可以控制序列化 - 我不确定这是否可以避免这个问题。
  • 升级到.NET 4.0并使用EF和POCO类(没有EntityBase作为父级)

最好的问候,拉迪斯拉夫

答案 1 :(得分:0)

我认为你必须使用KnownType属性。 例如,请参阅WCF issues with KnownType for Dictionary

[编辑]可以在此处找到有关此问题及其解决方案的更完整的讨论: WCF: Interfaces, Generics and ServiceKnownType