我想在WCF中将各种类公开为复杂类型,因此我根据需要在这些类型和属性上添加[DataContract]和[DataMember]属性。
但是,如果我想让它们从抽象基类继承(例如Person继承自抽象EntityBase),我会收到一个错误,即“无法从未标记为DataContractAttribute或SerializableAttribute的类型继承”。< / p>
问题是,如果我将[DataContract]属性添加到基类,那么该基类将通过WSDL向客户端公开。我想这不是什么大不了的事,但我更希望我的客户不知道我的内部实现。
如果我将[Serializable]属性添加到基类,那么它似乎首先工作(它可以被序列化但是在WSDL中没有引用EntityBase),但现在如果我向EntityBase添加任何属性,那么它将还抱怨它的属性不可序列化。 (例如,我添加了一个ICollection,然后我收到一条错误,即RuleViolation不可序列化。)
不幸的是,[Serializable]类型的[IgnoreDataMember]似乎没有类似物([NonSerialized仅适用于字段,而不适用于属性)。
所以基本上我想声明这个基类型,但不需要序列化它的任何成员;有没有办法在WCF中设置它,以便客户端看不到这种基类型?
答案 0 :(得分:1)
您是否尝试过根据[DataContract]
和[DataMember]
标记实体(以便使用默认序列化),而是使用[IgnoreDataMember]
标记基类属性?
你总是有几个选择,我担心你不会喜欢他们中的任何一个。
最好的问候,拉迪斯拉夫
答案 1 :(得分:0)
我认为你必须使用KnownType属性。 例如,请参阅WCF issues with KnownType for Dictionary
[编辑]可以在此处找到有关此问题及其解决方案的更完整的讨论: WCF: Interfaces, Generics and ServiceKnownType