WCF序列化与对象继承?

WCF序列化与对象继承?,wcf,.net-3.5,serialization,Wcf,.net 3.5,Serialization,我有两个对象,一个在我们的企业级,另一个在我们的服务级。服务对象正在从企业继承。下面是一个简单的例子: [DataContract] public class EnterpriseObject{ [DataMember] int ID{get; set;} string InternalUse{get; set;} } [DataContract] public class ServiceObject: EnterpriseBaseObject{ [D

我有两个对象,一个在我们的企业级,另一个在我们的服务级。服务对象正在从企业继承。下面是一个简单的例子:

[DataContract]
public class EnterpriseObject{
     [DataMember]
     int ID{get; set;}

     string InternalUse{get; set;}
}

[DataContract]
public class ServiceObject: EnterpriseBaseObject{
     [DataMember]     
     string Address{get; set;}
}

是否可以在序列化中仅公开ServiceObject(具有从EnterpriseObject继承的属性)?我不希望客户端看到企业对象作为选项列出?正如您在示例中看到的,没有为InternalUser属性设置DataMember属性。这是唯一的办法吗?谢谢

您通过向
EnterpriseBaseObject
添加
[KnownType(typeof(ServiceObject))]
来处理继承-但是,
EnterpriseBaseObject
仍然是合同的一部分,其存在将是公开的。但只会发布标记为
[DataMember]
的成员


一个选项(删除继承)是使用单独的DTO进行序列化,并在DTO版本和实际版本之间进行转换,但这需要额外的工作。

您能将此从is a模式更改为Has a模式吗?如果ServiceObject具有EnterpriseObject,则可以只公开所需的属性

编辑 如果我理解正确,您希望向客户端公开ServiceObject,包括其所有属性(标记为DataMember),包括从EnterpriseObject继承的属性。但您不希望客户机知道有一个名为EnterpriseObject的对象

可以通过隐藏存在企业对象的事实来实现这一点。而不是使用作为继承模式的“Is A”关系。你可以使用构图或“有”模式

现在,您已将企业对象与客户隔离。您的所有通信都是ServiceObject具有一些您不向客户机公开的属性,这些属性是由其他对象在服务器上实现的


这也类似于拥有DTO,DTO是唯一用于传输数据的对象。DTO允许您通过以客户机所需的格式提供客户机所需的内容来隐藏实现,而无需暴露内部对象。

不确定您在这里的意思。你能解释一下吗?我明白你在说什么。这是一个有趣的方法!谢谢
public class ServiceObject
{
   private EnterpriseObject _myEntObject;

   public string MyServiceObjectProperty
   {
      get;
      set;
   }

   public string MyEntObjectProperty
   {
     get { return _myEntObject.MyEntObjectProperty;}
   }
}