.net - 避免序列化 REST 服务中的某些属性

标签 .net wcf nhibernate rest serialization

我有一个在客户端和服务器端分开的 .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(装饰的订单)。从您的每个操作发送每个。

如果这不适合您,请在此处查看使用 DataContractSerializerOperationBehaviorIDataContractSurrogate 的自定义序列化:

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

关于.net - 避免序列化 REST 服务中的某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776532/

相关文章:

c# - NHibernate LINQ 查询中的关键回退

sql-server - 每个业务事务和身份 key 的 NHibernate 对话

.net - 我可以在 .NET 中避免 JIT 吗?

c# - 为什么在 WinForms (.NET) 中隐藏拥有的窗口切换应用程序?

asp.net - WCF 响应太长 - 身份验证错误

wcf - 轮询或不轮询(在 Web 服务上下文中)

c# - 高可用性

nhibernate - ADO.NET Entity Framework 与 NHibernate

C# 验证签名

c# - 为什么我无法使用 HIDSharp 连接到 USB 复合设备?