我想知道如何在WCF中配置已知类型.例如,我有一个Person类和一个Employee类.该员工类是的sublass 人类.这两个类都标有[DataContract]属性.
我不想硬编码类的已知类型,比如[ServiceKnownType(typeof(Employee))]在Person类中放置一个,以便WCF知道Employee是Person的子类.
现在,我在主机的App.config中添加了以下XML配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Person, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null">
<knownType type="Employee, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
<system.serviceModel>
.......
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我编译它,运行主机,在客户端添加服务引用并添加一些代码并运行客户端.但是发生了错误:
格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数时出错
http://www.herbertsabanal.net:person.InnerException消息是'第1行位置错误247.元素'http://www.herbertsabanal.net:person'包含'http://www.herbertsabanal.net/Data:Employee'数据协定的 数据.反序列化器不知道映射到此合同的任何类型.将与"Employee"对应的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中.有关更多详细信息,请参阅InnerException.
以下是数据合同:
[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Person")]
class Person
{
string _name;
int _age;
[DataMember(Name="Name", Order=0)]
public string Name
{
get { return _name; }
set { _name = value; }
} …Run Code Online (Sandbox Code Playgroud)