我们正在更新我们的架构,以便为可以在MVVM模式中使用的桌面,Web和移动设备使用单个对象模型。我希望能够通过使用控制器上的接口来限制通过Web API序列化的数据字段。这是必需的,因为移动设备的模型对象存储在HTML5本地存储中,因此不会携带可选数据,而瘦桌面客户端则能够存储(和使用)更多数据。
为了实现这一目标,模型将实现不同的接口,这些接口定义应该序列化哪些数据字段,并且将有一个特定于接口的控制器。
问题是Web API总是序列化模型中的每个字段,即使它不是返回的接口的一部分。我们怎样才能序列化返回接口中的字段?
答案 0 :(得分:2)
我知道如何自动化特定界面的序列化过程而不是整个对象 我写了里面有这样代码的库(现在这段代码由github gist共享)。它公开了名为ToDynamic的扩展方法。
public static dynamic ToDynamic<T>(this T value, bool deep = true);
使用特定的T提取该T类型中可用的字段 在下面的例子中,T将自动确定 因此,只有IClub成员才会被提取和序列化:
IReadOnlyList<IClub> clubs = retrieving.GetClubs(page, size, criteria);
return this.Request.CreateResponse(HttpStatusCode.OK, clubs.Select(item => item.ToDynamic()));
答案 1 :(得分:1)
我认为您可以使用JsonConverter或使用ContractResolver
执行此操作创建JsonConverter
并覆盖WriteJson
并编写逻辑以仅序列化所需的数据。请务必覆盖CanConvert
和CanWrite
。
您可以查看链接Custom conversion of specific objects in JSON.NET以获得想法
对于ContractResolver,请参阅链接http://quickduck.com/blog/2011/08/08/overriding-the-default-serialization-behavior-in-json-net/。在此,而不是使用base.CreateObjectContract( objectType );
使用new JsonObjectContract( objectType );
希望这有帮助
答案 2 :(得分:0)
创建一个只实现接口的新类(创建一个“viewmodel”),用所需的字段初始化该类并返回该对象是一个解决方案。
或者如果可能,将字段标记为私有。私有字段不会被序列化。 (限制田地的可见度总是一件好事)