[英]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#对象(POCO)添加了显式支持,因此您的类序列化得很好。
这可能有两个原因:
在.NET 3.5 SP1中 ,Aaron Skonnards 文章DataContracts中没有属性(POCO支持),可以找到一个很好的总结。
但是,就像@blowdart提到的那样,你应该装饰你的DataContracts,然后强制你使用DataMember,以便在序列化过程中显式化。 您迟早需要更改DataContract,您可能需要保持与现有客户端的向后兼容性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.