【问题标题】:WCF Serialization with object inheritance?带有对象继承的WCF序列化?
【发布时间】:2010-10-14 02:07:29
【问题描述】:

我有两个对象,一个在我们的企业级别,另一个在我们的服务级别。服务对象继承自企业。这是一个简单的例子:

[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 属性。这是唯一的方法吗?谢谢

【问题讨论】:

    标签: wcf .net-3.5 serialization


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您能否将其从 Is A 模式更改为 Has A 模式?如果 ServiceObject 有一个 EnterpriseObject,那么您可以只公开您需要的属性。

      编辑

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

      您可以通过隐藏存在企业对象的事实来做到这一点。而不是使用继承模式的“Is A”关系。您可以使用合成或“有 A”模式。

      public class ServiceObject
      {
         private EnterpriseObject _myEntObject;
      
         public string MyServiceObjectProperty
         {
            get;
            set;
         }
      
         public string MyEntObjectProperty
         {
           get { return _myEntObject.MyEntObjectProperty;}
         }
      }
      

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

      这也类似于拥有 DTO,这是一个唯一目的是传输数据的对象。 DTO 允许您通过以客户需要的格式准确地提供他们需要的内容来隐藏您的实现,而不会暴露您的内部对象。

      【讨论】:

      • 不确定您的意思。你能解释一下吗?
      • 我明白你在说什么。这是一个有趣的方法!谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多