当我在WCF中使用它时,我应该将我的类/属性装饰为DataContract / DataMember吗?

时间:2009-08-28 13:19:13

标签: c# wcf nhibernate datacontract

我有一个包含对象和数据访问代码的框架。使用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的属性进行装饰?我应该装饰它们吗?

由于

2 个答案:

答案 0 :(得分:3)

你不必,但你应该。特定的合同声明允许您控制如何在线上序列化类,允许您隐藏属性,重新排序消息中的属性,使一些属性可选,一些是必需的,并控制数据协定的命名空间。

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

答案 1 :(得分:3)

由于.NET 3.5 SP1中为普通旧C#对象(PO​​CO)添加了显式支持,因此您的类序列化得很好。

这可能有两个原因:

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

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

但是,就像@blowdart提到的那样,你应该装饰你的DataContracts,然后强制你使用DataMember,以便在序列化过程中显式化。您迟早需要更改DataContract,您可能需要保持与现有客户端的向后兼容性。