我有一个.Net应用程序分为客户端和服务器端,服务器提供REST服务(使用WCF)。我有这样的服务定义:
[WebGet(UriTemplate = "/Customers/{id}")]
Customer GetCustomerById(string id);
[WebGet(UriTemplate = "/Customers")]
List<Customer> GetAllCustomers();
Customer 类及其朋友使用 Fluent NHibernate 和延迟加载映射到数据库。如果我从会话范围之外的服务返回,服务调用将失败,因为它无法序列化引用的延迟加载的 Orders 属性(请参阅末尾的类 def)。问题是我需要延迟加载,因为我不希望我的GetAllCustomers
- 获取所有引用订单的服务。所以我想做的是以某种方式通知序列化程序,使其不会尝试序列化 GetAll 上的订单。但请注意,必须在 GetCustomerById 上序列化相同的属性 - 因此我必须在服务上指定这一点。这可以吗?
课程:
public class Customer
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Order> Orders { get; set; }
}
public class Order
{
public virtual int Id { get; set; }
// ++
}
如果您使用 WCF 的默认序列化(我认为您会这样做),您将显式标记要通过网络发送的属性并保留其余部分。这是使用完成的[DataMember]
我假设你这样做:
[DataContract]
public class Customer
{
[DataMember]
public virtual int Id { get; set; }
[DataMember]
public virtual string Name { get; set; }
// not decorate
public virtual IList<Order> Orders { get; set; }
}
UPDATE好的,有时需要发送,有时不发送。显然,您可以拥有 CustomerBase 类(没有订单),然后是 Customer(未装饰的订单)和 CustomerWithOrders(装饰的订单)。从您的每项操作中发送每一项。
如果这不适合您,请查看使用自定义序列化DataContractSerializerOperationBehavior
and IDataContractSurrogate
here:
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior_members.aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior_members.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)