C# WCF服务对象序列化

C# WCF服务对象序列化,c#,wcf,silverlight,inheritance,C#,Wcf,Silverlight,Inheritance,我有一个抽象类名为contact,另一个类名为client,它继承自contact。我正在使用一个方法处理一个WCF服务,该方法接受contact类型的参数。 然而,我有一个我想要传递的客户端实例。 我面临着这个错误: 键入“xxx.Client”,数据合同名称为“Client:http://schemas.datacontract.org/2004/07/xxx”他说。将任何静态未知的类型添加到已知类型列表中-例如,使用KnownTypeAttribute属性或将它们添加到传递给DataCon

我有一个抽象类名为contact,另一个类名为client,它继承自contact。我正在使用一个方法处理一个WCF服务,该方法接受contact类型的参数。 然而,我有一个我想要传递的客户端实例。 我面临着这个错误:

键入“xxx.Client”,数据合同名称为“Client:http://schemas.datacontract.org/2004/07/xxx”他说。将任何静态未知的类型添加到已知类型列表中-例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中


使用和属性来确保关系。

WCF不能直接在抽象类上工作。您应在datacontract或服务类上使用KnownType属性。下面是一些例子

[DataContract]
[KnownType(typeof(Client))]
public class Contact
{
   ...
}

[ServiceContract]
[ServiceKnownType(typeof(Client))]
public interface IMyService
{
    contact getcontact(Guid id);
}

您需要让DataContractSerializer知道
客户端
是一种
联系人

[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
有几种方法可以做到这一点,但它们都围绕使用属性或属性展开

KnownType
可以放在
Client
类上,告诉DataContractSerializer它是
联系人的KnownType

[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
KnownType
也可以放在一个类上,以指示序列化该类时,您可能还会遇到另一个类

如果您有一个
DataContract
类,该类的属性是
联系人
,实际上可能包含一个
客户端
,则可能需要执行此操作:

[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
    Contact MeetingContact{get;}
}
在这种情况下,您可以在不指定客户机上的KnownType的情况下离开。如果您有一个返回集合的属性,并且希望指定集合中可以包含的类型,则也可能需要执行此操作

您可以指定将返回已知类型的静态方法的名称,而不是指定KnownType的实际类型:

[DataContract]
[KnownType("GetKnownTypes")]
public class Meeting
{
    Contact MeetingContact{get;}

    private static Type[] GetKnownType()
    {
    return new Type[]{typeof(Client)};
    }
}
您还可以通过指定已知类型

ServiceKnownTypes以类似的方式工作,但在服务本身上指定:

[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{

    [OperationContract]
    Contact GetContact();
}
此设置将让DataContactSerializer知道任何方法都可能返回类型为
客户端的类型。与已知类型类似,您还可以使用静态方法来提供已知类型的服务