【问题标题】:WCF Contracts and Polymorphism with different namespaces: what gives?具有不同命名空间的 WCF 合同和多态性:提供了什么?
【发布时间】:2014-08-16 14:58:03
【问题描述】:

如何在这样的场景中执行多态性:

如果我在命名空间 Foo 中有一个从命名空间 Bar 中的类 Dog 继承的 Dachshund 类:

namespace Bar
{
  public class Dog
  {
    public string Color { get; set; }
    public string Bark { get; set; }
  }
}

namespace Foo
{
  public class Dachshund : Dog
  {
    public int Length { get; set; }
  }
}

我使用 Dachshund 做一些狗的事情,但将它作为狗传递给 wcf,是什么给出的?一些序列化问题:

[ServiceBehavior]
public class myWcfService : ImyWcfService
{
  [OperationBehavior]
  public Message GetDog()
  {
    var myDach = new Dachshund();
    // do some stuff with my dach
    return new Message { Dog = myDach as Dog, Message = "I'm sending a dog" };
  }
}

public class Message
{
  public Dog Dog { get; set; }
  public string Message { get; set; }
}

【问题讨论】:

  • 您需要[ServiceKnownType(typeof(Dachshund))]。否则 DataContractSerializer 不知道如何处理该类并将其序列化为 Dog。
  • 我添加了属性,但它仍然不会发送合同。我将对象值映射为值并且有效。这就是我要避免的
  • 如果我将 [ServiceKnownType] 属性添加到服务 contract (接口,而不是实际的类),它对我有用。你试过吗?
  • 哦,我傻了,我把它添加到 Dog 类...
  • 让我知道这是否解决了您的问题,我可以发布正确的答案...

标签: c# wcf namespaces polymorphism


【解决方案1】:

您需要将[ServiceKnownType] 属性添加到您的服务contract(定义服务操作的接口,而不是服务实现(实际类):

[ServiceContract]
[ServiceKnownType(typeof(Dachshund))]  // <- Add this attribute
public interface ImyWcfService
{
   //...
}

这足以让 DataContractSerializer “了解”您的类并能够正确序列化/反序列化它。

【讨论】:

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