我有各种类,我想在WCF中公开为复杂类型,因此我根据需要在这些类型和属性上添加[DataContract]和[DataMember]属性 .
但是,如果我想让它们从抽象基类继承(例如Person继承自抽象EntityBase),我会收到类型“无法从未标记为DataContractAttribute或SerializableAttribute的类型继承”的错误 .
问题是,如果我将[DataContract]属性添加到基类,那么该基类通过WSDL暴露给客户端 . 我想这不是什么大不了的事,但我希望我的客户不知道我的内部实现 .
如果我将[Serializable]属性添加到基类,那么它似乎首先工作(它可以被序列化但是在WSDL中没有引用EntityBase),但现在如果我向EntityBase添加任何属性,那么它也会抱怨它的属性不可序列化 . (例如,我添加了一个ICollection,然后我得到一个错误,即RuleViolation不可序列化) .
不幸的是,对于[Serializable]类型,[IgnoreDataMember]似乎没有类似物([NonSerialized仅适用于字段,不适用于属性) .
所以基本上我想声明这个基类型,但不需要序列化它的任何成员;有没有办法在WCF中设置它,以便客户端看不到这种基类型?
2 回答
您是否尝试过根本不使用DataContract和DataMember创建实体(以便使用默认序列化)并使用IgnoreDataMember标记基类属性?
你总是有几个选择,我很害怕你不喜欢他们中的任何一个 .
创建一组DTO对象并将实体转换为DTO . 如果您想要隐藏内部实现,通常是最佳实践 .
为每个实体创建suroggate类(实现IDataContractSuroggate),以便您可以控制序列化 - 我不确定这是否可以避免此问题 .
升级到.NET 4.0并将EF与POCO类一起使用(没有EntityBase作为父级)
最好的问候,拉迪斯拉夫
我认为你必须使用KnownType属性 . 例如见WCF issues with KnownType for Dictionary
[编辑]可以在此处找到有关此问题及其解决方案的更完整的讨论:WCF: Interfaces, Generics and ServiceKnownType