2010-08-16 58 views
2

我有我想在WCF暴露为复杂类型的各种类,所以我添加[DataContract]和[数据成员]属性作为必要对这些类型和属性。但是,如果我想让它们从抽象基类继承(例如,Person从抽象EntityBase继承),则会出现类型“不能从未使用DataContractAttribute或SerializableAttribute标记的类型继承”的错误。继承在WCF抽象类不暴露该类

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

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

不幸的似乎没有模拟到[IgnoreDataMember]一种[序列化]类型([非序列化仅适用于字段,而不是属性)。

所以基本上我想声明这个基础类型,但不需要任何成员被序列化;有什么办法可以在WCF中进行设置,因此客户端看不到这种基本类型?

回答

1

你尝试并不makring与DataContract和DataMember您的实体(以便默认序列化被使用)并用IgnoreDataMember标记基类属性?

你总是有好几种选择,我affraid你不会喜欢任何人。

  • 创建一组DTO对象并将实体转换为DTO。一般来说,如果你想隐藏你的内部实现的最佳做法。
  • 创建suroggate类(实现IDataContractSuroggate)为每个实体,让你有过序列化的控制 - 我不知道这是否可以避免这个问题。
  • 升级到.NET 4.0,并使用EF与POCO类(无EntityBase父)

最好的问候,拉吉斯拉夫

+0

感谢Ladislav的建议。我应该提到我已经在使用EF4/POCO,EntityBase是我自己的,而不是EF的一部分。我没有尝试使用“默认”序列化,但我对它的“退出”类型模型并不满意。你对使用DTO的可能性是正确的,但在这一点上,“问题”还不够坏,不值得麻烦。 – 2010-08-17 12:28:42