2011-01-05 211 views
2

我有两个班以下设置:WCF和对象的继承

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

如果我使用父和子类如上stub类仅包含摘要属性。

我看过使用KnownType属性上ChildData类,像这样:

[DataContract] 
[KnownType(typeOf(ParentData)] 
public class ChildData : ParentData{ 
    [DataMember] 
    public string Abstract{get;set;} 
} 

然而,这没有奏效。

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

有没有办法来告诉它应该扁平化继承到子类的串行即ChildData

+0

可能的重复[有没有办法隐藏/展平WCF服务数据契约中的基类型?](http://stackoverflow.com/questions/3499788/is-there-any-way-to-hide-flatten – 2011-01-05 13:15:42

回答

1

我相信你ParentData类也需要有[DataContract]属性:

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

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

+0

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

0

我相信你ParentData类应标明抽象的,也需要有[DataContract]属性:

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

正如马克说,在[Serializable接口]并没有真正使用默认的数据WCF帮助合约序列化程序。