WCF继承/多态和序列化

时间:2009-05-04 22:51:51

标签: wcf datacontractserializer

我有一个类ReportDef,这是一个具体的类,我根据需要使用[DataContract][DataMember]属性进行了修饰。 ReportDef与我的A1ServiceContract一起在汇编IReportService中。然后我有另一个类UiReportDef,它派生自ReportDef并且在汇编A2中。 UiReportDef没有服务关心的其他状态。

我想用UiReportDef的实例调用我的服务。有没有办法(没有从ReportDef手动构建UiReportDef实例)来执行此操作而不让我的服务知道A2?我知道KnownType。我不想引用A2


编辑:以下是一些可能使我的问题更容易理解的背景信息。我的ServiceContract实现了IReportService,它定义了一种方法RunReport(ReportDef report)ReportDef使用DataContract属性进行修饰,并使用DataMember修饰私有成员。 UiReportDef位于依赖于UI相关程序集等的程序集中。我没有设计现有的类层次结构。我需要将ReportDefsUiReportDefs(作为ReportDefs)传递给新服务。由于ReportDef具体,我希望序列化程序在没有任何其他信息的情况下将UiReportDefs视为ReportDefs

3 个答案:

答案 0 :(得分:2)

我不明白你的问题。

但是我觉得我现在理解它的一部分,你想反序列化一个没有引用它的程序集中的对象?

如果是这样,除非你愿意进行大量反思并将其定义/引用为“对象”,否则你不能

执行此操作的常用方法是尝试在我之前的答案中解释,您应该使用可由客户端/服务器引用的接口。

通常的做法是创建存根集合,除此之外只包含接口。

或者,正如您对问题的评论所示,您可以使用DTO对象。 http://en.wikipedia.org/wiki/Data_Transfer_Object

答案 1 :(得分:1)

这个帖子可能有很大帮助:WCF Inheritance and DataContract

答案 2 :(得分:-3)

WCF不是多态的,因为它不是面向对象的。因此,这是不可能的。