首页 文章

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

提问于
浏览
2

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

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

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

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

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

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

2 回答

  • 0

    您是否尝试过根本不使用DataContract和DataMember创建实体(以便使用默认序列化)并使用IgnoreDataMember标记基类属性?

    你总是有几个选择,我很害怕你不喜欢他们中的任何一个 .

    • 创建一组DTO对象并将实体转换为DTO . 如果您想要隐藏内部实现,通常是最佳实践 .

    • 为每个实体创建suroggate类(实现IDataContractSuroggate),以便您可以控制序列化 - 我不确定这是否可以避免此问题 .

    • 升级到.NET 4.0并将EF与POCO类一起使用(没有EntityBase作为父级)

    最好的问候,拉迪斯拉夫

  • 1

    我认为你必须使用KnownType属性 . 例如见WCF issues with KnownType for Dictionary

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

相关问题