【问题标题】:WCF Service object serializationWCF 服务对象序列化
【发布时间】:2012-05-15 14:47:28
【问题描述】:

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

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

【问题讨论】:

    标签: c# wcf silverlight inheritance


    【解决方案1】:

    您需要让 DataContractSerializer 知道 ClientContact 的一种类型。

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

    KnownType 可以放在 Client 类上,告诉 DataContractSerializer 它是 Contact 的 KnownType。

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

    KnownType也可以放在一个类上,表示在序列化这个类时你也可能遇到这个其他类。

    如果您有一个DataContract 类,该类的属性为Contact,而实际上可能包含Client,则您可能需要这样做:

    [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)};
        }
    }
    

    您也可以通过configuration file指定已知类型。

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

    [ServiceKnownType(typeof(Client))]
    [ServiceContract()]
    public interface IMyServiceContract
    {
    
        [OperationContract]
        Contact GetContact();
    }
    

    此设置将使 DataContactSerializer 知道任何方法都可能返回类型为 Client 的类型。与已知类型类似,您也可以使用静态方法来提供已知类型的服务。

    【讨论】:

      【解决方案2】:

      WCF 不直接作用于抽象类。您应在数据合同或服务类上使用 KnownType 属性。以下是示例;

      [DataContract]
      [KnownType(typeof(Client))]
      public class Contact
      {
         ...
      }
      
      [ServiceContract]
      [ServiceKnownType(typeof(Client))]
      public interface IMyService
      {
          contact getcontact(Guid id);
      }
      

      【讨论】:

        【解决方案3】:

        使用[KnownType][ServiceKnownType] 属性来确保关系。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多