繁体   English   中英

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

[英]Should i decorate my classes/properties as DataContract/DataMember when i use them in WCF?

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

谢谢

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

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

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

这可能有两个原因:

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

在.NET 3.5 SP1中 ,Aaron Skonnards 文章DataContracts中没有属性(POCO支持),可以找到一个很好的总结。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM