我有一个包含对象和数据访问代码的框架。使用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的属性进行装饰?我应该装饰它们吗?
由于
答案 0 :(得分:3)
你不必,但你应该。特定的合同声明允许您控制如何在线上序列化类,允许您隐藏属性,重新排序消息中的属性,使一些属性可选,一些是必需的,并控制数据协定的命名空间。
如果你不这样做,那么.NET会对它做出不错的猜测,但是在某些时候你需要控制,例如,如果你向一个类添加了一个新属性但是希望老客户端能够工作,那么你可以将它作为一个数据合同中的可选成员,旧客户端将继续工作。
答案 1 :(得分:3)
由于.NET 3.5 SP1中为普通旧C#对象(POCO)添加了显式支持,因此您的类序列化得很好。
这可能有两个原因:
Aaron Skonnards article DataContracts without attributes (POCO support) in .NET 3.5 SP1可以找到一个很好的总结。
但是,就像@blowdart提到的那样,你应该装饰你的DataContracts,然后强制你使用DataMember,以便在序列化过程中显式化。您迟早需要更改DataContract,您可能需要保持与现有客户端的向后兼容性。