首页 文章

WCF DataContract - 将派生类视为序列化的基类

提问于
浏览
1

我有一个简单的数据 Contract :

[DataContract]
public class MyData
{
   [DataMember]
   public string AwesomeData { get; set; }
}

和服务 Contract :

[ServiceContract]
public interface IMyDataService
{
   [OperationContract]
   MyData GetAwesomeData();
}

在服务器端程序集中,我创建了一个用于进行处理的派生类:

public class MyDataWithInnerds: MyData
{
   public MyDataWithInnerds(object intializationStuff)
   {
      AwesomeData = Hypermaxulate(initializationStuff);
   }
}

和服务实施:

public class MyDataService: IMyDataService
{
  public MyData GetAwesomeData()
  {
     return new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff());
  }
}

MyDataWithInnerds只是纯数据 Contract MyData的功能实现 .

反正有没有装饰MyData并引用MyDataWithInnerds来告诉序列化器将MyDataWithInnerds序列化为MyData?具有MyData的程序集也会提供给客户端 . 我不希望只引用服务器端的MyDataWithInnerds .

我不需要将其反序列化为MyDataWithInnerds . 我猜我需要将MyDataWithInnerds实例克隆到MyData实例,因此它没有与MyDataWithInnerds相关联的任何类型信息,但是不必这样做并且让序列化器知道它真的很有效“我知道这是一个MyDataWithInnerds,但你可以像对待MyData那样对待它”

谢谢,迈克

EDIT

我能够将以下内容添加到服务器上的配置文件中:

<system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="MyClientLib.MyData, MyClientLib">
          <knownType type="MyServerLib.MyDataWithInnerds, MyServerLib"/>
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>

这使序列化正常工作 .

它只留下两个侧面问题:

  • 在我的JSON序列化中,我最终得到了一个包含派生类类型的"__type"成员 . 我可以删除吗?

  • 在服务器对象(不是MyData)上是否有声明性的方法,我在配置中做了什么(添加了KnownType)?

谢谢,迈克

1 回答

  • 1

    最后,我为我的基类创建了一个复制构造函数,而不是返回派生类(作为基类),我返回新的基(派生) .

    [DataContract]
    public class MyData
    {
       [DataMember]
       public string AwesomeData { get; set; }
    
       public MyData(MyData obj)
       {
           AwesomeData = obj.AwesomeData;
       }
    }
    

    然后,服务实现变为:

    public class MyDataService: IMyDataService
    {
      public MyData GetAwesomeData()
      {
         MyDataWithInnerds data = 
             new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff());
         return new MyData(data);
      }
    }
    

    在简单的例子中,它看起来有点过分,但在实际的应用程序中,它运行得很好 - 没有额外的配置,也没有发出无关的序列化数据 .

相关问题