C# WCF与对象继承

C# WCF与对象继承,c#,wcf,C#,Wcf,我有以下两个类的设置: [SerializableAttribute] public class ParentData{ [DataMember] public string Title{get;set;} } [DataContract] public class ChildData : ParentData{ [DataMember] public string Abstract{get;set;} } 这两个类通过WCF服务提供服务。但是,我只希望服务向最终用户公开Ch

我有以下两个类的设置:

[SerializableAttribute]
public class ParentData{
  [DataMember]
  public string Title{get;set;}
}

[DataContract]
public class ChildData : ParentData{
  [DataMember]
  public string Abstract{get;set;}
}
这两个类通过WCF服务提供服务。但是,我只希望服务向最终用户公开ChildData类,但从父级提取标记的DataMember属性。例如,消费客户端的存根类如下所示:

public class ChildData{
  public string Title{get;set;}
  public string Abstract{get;set;}
}
如果我像上面那样使用父类和子类,那么存根类只包含抽象属性

我在ChildData类上使用了KnownType属性,如下所示:

[DataContract]
[KnownType(typeOf(ParentData)]
public class ChildData : ParentData{
  [DataMember]
  public string Abstract{get;set;}
}
然而,这并没有起作用

然后我将DataContract属性应用于ParentData类,但是这会在客户端应用程序中创建两个我不想要的存根类


有没有办法告诉序列化程序它应该将继承平坦化为子类的继承,即ChildData

我相信您的
ParentData
类也需要具有
[DataContract]
属性:

[DataContract]
public class ParentData
{
  [DataMember]
  public string Title{get;set;}
}
[DataContract]
public abstract class ParentData
{
  [DataMember]
  public string Title{get;set;}
}

[Serializable]
对于使用默认数据协定序列化程序的WCF没有真正的帮助。

我认为您的ParentData类应该标记为abstract,并且还需要具有[DataContract]属性:

[DataContract]
public class ParentData
{
  [DataMember]
  public string Title{get;set;}
}
[DataContract]
public abstract class ParentData
{
  [DataMember]
  public string Title{get;set;}
}

正如marc所说,[Serializable]对于使用默认数据协定序列化程序的WCF并没有真正的帮助。

在ParentData类上添加[DataContract]属性的问题可能是,消费客户端将创建两个表示继承链的存根类,这是我想要避免的。为了解决这个问题,我可以让我的项目移动,就是将ParentData类变成一个接口。这并不理想,但暂时会奏效。