【问题标题】:Inherit from abstract class in WCF without exposing that class从 WCF 中的抽象类继承而不暴露该类
【发布时间】:2011-03-30 15:27:43
【问题描述】:

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

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

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

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

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

所以基本上我想声明这个基类型,但不需要序列化它的任何成员;有什么方法可以在 WCF 中进行设置,这样客户端就看不到这个基类型了吗?

【问题讨论】:

    标签: c# wcf serialization


    【解决方案1】:

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

    你总是有几个选择,恐怕你不会喜欢其中任何一个。

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

    最好的问候,拉迪斯拉夫

    【讨论】:

    • 感谢拉迪斯拉夫的建议。我应该提到我已经在使用 EF4/POCO,EntityBase 是我自己的,不是 EF 的一部分。我没有尝试使用“默认”序列化,但我真的不喜欢它的“选择退出”类型模型。您对使用 DTO 的可能性是正确的,但在这一点上,“问题”还不够糟糕,值得麻烦。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 Peladao,我确实已经尝试过使用 KnownType(在基类和派生类上),但如果类本身没有标记两个序列化属性之一,它仍然会抛出错误。
    猜你喜欢
    • 2012-07-29
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多