gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:07:32 25 4
gpt4 key购买 nike

我有一个在客户端和服务器端分开的 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com