【问题标题】:Should i decorate my classes/properties as DataContract/DataMember when i use them in WCF?当我在 WCF 中使用我的类/属性时,我应该将它们装饰为 DataContract/DataMember 吗?
【发布时间】:2009-08-28 13:19:12
【问题描述】:

我有一个包含对象和数据访问代码的框架。这些对象使用 NHibernate 映射到数据库。

例如,我的框架有类 Customer 和 Order:

public class Customer
{
      private Guid _id;
      private string _name;
      private IList<Order> _orders;

      public properties...
}


public class Order
{
     private Guid _id;
     private string _orderNumber;

     public properties...
}

我还有一个带有 PersistCustomer 方法的 WCF 服务。 像这样:

[ServiceContract]
public interface ICustomerService
{

      [OperationContract]
      void PersistCustomer(Customer customer);
}

这个 WCF 引用了我的框架库。

我已经为 WCF 服务创建了一个客户端应用程序(一个简单的控制台应用程序)并且它可以工作!

我无法理解的主要事情:为什么不将我在框架中的类装饰为 DataContract 并将它们的属性装饰为 DataMembers 就可以工作?我应该装饰它们吗?

谢谢

【问题讨论】:

  • 您的任何库类型是否标记为[Serializable]
  • 没有。我的一个类被装饰为 [Serializable],但是当我尝试将此对象传递给 WCF 时遇到了问题。它在传递的子集合上失败,因为它无法反序列化它。所以我删除了 [Serializable] 属性,现在它可以工作了。

标签: c# wcf nhibernate datacontract


【解决方案1】:

您不必这样做,但应该这样做。特定的契约声明允许您控制类在网络上的序列化方式,允许您隐藏属性、重新排序消息中的属性、使某些属性为可选、某些为强制性,以及控制数据契约的命名空间。

如果你不这样做,那么 .NET 会对其进行一个不错的猜测,但在某些时候你需要控制,例如,如果你向一个类添加了一个新属性但希望旧客户端能够工作,你会将它作为一个数据合约中的可选成员,旧客户端将继续工作。

【讨论】:

  • 是的,完全正确-它可能在没有属性的情况下工作,但是显式有助于以后的维护,尤其是当其他人接管时。明确 - 让您的生活更轻松! :-)
【解决方案2】:

由于在 .NET 3.5 SP1 中添加了对普通旧 C# 对象 (POCO) 的显式支持,您的类可以很好地序列化。

添加这可能有两个原因:

  • 向后兼容 ASMX 服务
  • 简化 WCF 入门

可以在 Aaron Skonnards article DataContracts without attributes (POCO support) in .NET 3.5 SP1 中找到一个很好的总结。

但是,就像@blowdart 提到的那样,您应该装饰您的 DataContracts,这将迫使您使用 DataMember,以便在序列化期间明确。迟早您将需要更改 DataContract,并且您可能需要保持与现有客户端的向后兼容性。

【讨论】:

  • POCO 代表普通旧 CLR 对象(相对于 C# 对象)
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2019-06-25
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多