WCF服务对象序列化

anc*_*dev 8 c# silverlight wcf inheritance

我有一个名为contact的抽象类,另一个名为client的类继承自contact.我正在使用带有类型联系参数的方法处理WCF服务.但是我拥有的是我想传递的客户端实例.我面临这个错误:

输入数据合约名称为"客户:http://schemas.datacontract.org/2004/07/xxx"的"xxx.Client"不是预期的.将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

Sam*_*der 7

你需要让DataContractSerializer知道a Client是一种类型Contact.

有几种方法可以做到这一点,但它们都围绕着使用KnownType属性或ServiceKnownType属性.

KnownType可放置在Client类地告诉DataContractSerializer的,这是一个KnownType Contact.

[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
Run Code Online (Sandbox Code Playgroud)

KnownType也可以放在一类,表明这个串行化类时,你可能还会遇到这样其他类.

如果您的DataContract类具有Contact可能实际包含的属性,则可能需要执行此操作Client:

[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
    Contact MeetingContact{get;}
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以在不指定客户端上的KnownType的情况下离开.如果您有一个返回集合的属性,并且您想要指定集合中可以包含的类型,则可能还需要执行此操作.

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

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

    private static Type[] GetKnownType()
    {
    return new Type[]{typeof(Client)};
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过配置文件指定已知类型.

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

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

    [OperationContract]
    Contact GetContact();
}
Run Code Online (Sandbox Code Playgroud)

这个设置将让DataContactSerializer知道任何方法都可以返回一种类型Client.以与已知类型类似的方式,您还可以使用静态方法来提供已知类型的服务.

  • +1:2分钟太晚,但更有用的细节. (2认同)

dar*_*yal 5

WCF不直接用于抽象类.您应在datacontract或服务类上使用KnownType属性.以下是例子;

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

[ServiceContract]
[ServiceKnownType(typeof(Client))]
public interface IMyService
{
    contact getcontact(Guid id);
}
Run Code Online (Sandbox Code Playgroud)