客户端lib中的抽象类,以及共享库中的具体类

时间:2011-09-02 19:27:24

标签: wcf serialization known-types

如何使用共享客户端库中定义的抽象类以及服务器端库中的具体实现来解决序列化问题。

Interface in shared client library :

  [ServiceContract(SessionMode=SessionMode.Required)]
  [ServiceKnownType(typeof(SharedClient.Shape))]
  public interface IMyInterface
  {
    void UploadDrawing(Drawing dr);
  }

Concreate Drawing class in shared client library :

  [DataContract]
  [KnownType(typeof(SharedClient.Shape))]
  public class Drawing
  {
    public Shape s;
  }

Abstract class in shared client library :

  [DataContract]
  abstract public class Shape
  {
    [DataMember]
    public abstract string Name;
  }

Concrete class implementation in separate library which references the client library :

  [DataContract]
  public class Cirle : ClientLibrary.Shape
  {
    public override string Name { get; set; } 
  }

我一直收到异常消息:

  

尝试序列化参数时出错   http://tempuri.org/:Drawing。 InnerException消息是'Type   带有数据合同名称的“圈子”   'Circle:http://schemas.datacontract.org/2004/07/'不是预期的。   考虑使用DataContractResolver或添加任何未知的类型   静态地到已知类型的列表 - 例如,通过使用   KnownTypeAttribute属性或通过将它们添加到已知列表中   传递给DataContractSerializer的类型。'。请参阅InnerException   了解更多详情。

1 个答案:

答案 0 :(得分:1)

KnownType以其他方式运作。如果要使用KnownType属性,则必须在基类上使用它来定义其子类:

[DataContract]
[KnownType(typeof(Circle))]
abstract public class Shape
{
    [DataMember]
    public abstract string Name;
}  

在你的情况下,这不会太有帮助。尝试将ServiceKnownType与接口上的具体类放在一起:

[ServiceContract(SessionMode=SessionMode.Required)]
[ServiceKnownType(typeof(Circle))]
public interface IMyInterface
{
    void UploadDrawing(Drawing dr);
}

您不必将Shape定义为ServiceKnownType - 它已经知道,因为它在Drawing中使用但WCF却不知道Circle类型