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

时间:2012-02-08 23:32:17

标签: wcf datacontractserializer datacontract

我有一份简单的数据合同:

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

服务合同:

[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只是纯数据契约MyData的功能实现。

无论如何没有装饰MyData并引用MyDataWithInnerds告诉序列化器将MyDataWithInnerds序列化为MyData?带有MyData的程序集也会提供给客户端。我不希望只引用服务器端的MyDataWithInnerds。

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

谢谢, 迈克

修改

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

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

这使序列化工作正常。

它只留下两个侧面问题:

  1. 在我的JSON序列化中,我最终得到一个包含派生类类型的“__type”成员。我可以删除吗?
  2. 在服务器对象(不是MyData)上是否有声明性的方法,我在配置中做了什么(添加了KnownType)?
  3. Thanks2, 麦克

1 个答案:

答案 0 :(得分:1)

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

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

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