我在 WCF 服务中有一个方法,它返回一个复杂类型 (myComplexResult),其中包括一个列表 (Of Common.myBaseClass) 作为其成员之一。我希望这个列表包含不同类型的 Foo.myClass1 和 Bar.myClass2 的项目,它们都继承自 Common.myBaseClass。请注意,所有这些类都在不同的程序集中定义。
该服务抛出此异常:
不应使用数据合同名称“myClass1: http://mynamespace/foo/ ”键入“Foo.myClass1” 。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。
好的,所以我意识到我需要将 myClass1 和 myClass2 声明为 myBaseClass 的已知类型,以便 DataContractSerializer 知道如何处理它们。我不能做显而易见的事情并使用 myClass1 和 myClass2 的 KnownType 属性来装饰 myBaseClass 类,因为这意味着添加对 Foo 和 Bar 程序集的引用,这会导致循环依赖。
我希望在我的配置文件中使用 declareTypes 并且我尝试了这个:
<system.runtime.serialization >
<dataContractSerializer >
<declaredTypes >
<add type ="Common.myBaseClass, Common">
<knownType type ="Foo.myClass1, Foo" />
<knownType type ="Bar.myClass2, Bar" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
这似乎没有帮助,所以我尝试将 KnownType 属性添加到 myComplexResult:
<DataContract(name:="myComplexResult", [namespace]:="http://mynamespace/coo/")> _
<KnownType(GetType(Foo.myClass1))> _
Public Class myComplexResult
<DataMember(name:="myList")> _
Public myList As List(Of Common.myBaseClass)
但我仍然遇到同样的错误。帮助!我该怎么办?