为不同程序集中的数据协定声明已知类型

时间:2009-06-11 14:49:27

标签: wcf inheritance datacontractserializer known-types

我在WCF服务中有一个方法,它返回一个复杂类型(myComplexResult),它包含一个List(Of Common.myBaseClass)作为其成员之一。我希望这个列表包含可以不同类型的项目Foo.myClass1和Bar.myClass2,两者都继承自Common.myBaseClass。请注意,所有这些类都在不同的程序集中定义。

该服务抛出此异常:

  

类型   'Foo.myClass1'   与数据合同名称   'MyClass1的:http://mynamespace/foo/'   不是预期的。不添加任何类型   静态地知道已知的名单   类型 - 例如,通过使用   KnownTypeAttribute属性或   将它们添加到已知类型列表中   传递给DataContractSerializer。

好的,所以我意识到我需要将myClass1和myClass2声明为已知类型的myBaseClass,以便DataContractSerializer知道如何处理它们。我不能做明显的事情并使用myClass1和myClass2的KnownType属性装饰myBaseClass类,因为这意味着添加对Foo和Bar程序集的引用,这会导致循环依赖。

我希望在配置文件中使用declaredTypes,我尝试了这个:

<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)

但我仍然遇到同样的错误。救命!我该怎么办?

1 个答案:

答案 0 :(得分:3)

我的错。我已经重新尝试了,上面发布的两个解决方案实际上都有效。我认为这是在运行测试之前根本不更新我的测试项目上的服务引用的情况 - 哎呀!!!