我有一个在客户端和服务器端分开的 .Net 应用程序,服务器提供 REST 服务(使用 WCF)。我有这样的服务定义:
[WebGet(UriTemplate = "/Customers/{id}")]
Customer GetCustomerById(string id);
[WebGet(UriTemplate = "/Customers")]
List<Customer> GetAllCustomers();
Customer 类及其 friend 使用 Fluent NHibernate 和延迟加载映射到数据库。如果我从 session 范围之外的服务返回,服务调用将失败,因为它无法序列化引用的延迟加载的 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; }
}
更新 好的,您有时需要发送,有时不需要发送。显然,您可以有 CustomerBase 类(没有订单),然后是 Customer(未装饰的订单)和 CustomerWithOrders(装饰的订单)。从您的每个操作发送每个。
如果这不适合您,请在此处查看使用 DataContractSerializerOperationBehavior
和 IDataContractSurrogate
的自定义序列化:
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx
关于.net - 避免序列化 REST 服务中的某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776532/