2

我们正在更新我们的架构,以使用可用于 MVVM 模式的桌面、Web 和移动设备的单一对象模型。我希望能够通过使用控制器上的接口来限制通过 Web API 序列化的数据字段。这是必需的,因为移动设备的模型对象存储在 HTML5 本地存储中,因此不携带可选数据,而瘦桌面客户端将能够存储(和使用)更多数据。

为了实现这一点,模型将实现不同的接口,这些接口定义了哪些数据字段应该被序列化,并且会有一个特定于接口的控制器。

问题是 Web API 总是序列化模型中的每个字段,即使它不是返回的接口的一部分。我们怎样才能只序列化返回接口中的字段呢?

4

3 回答 3

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()));
于 2014-04-28T12:42:50.837 回答
1

我认为您可以使用 JsonConverter 或使用 ContractResolver 来做到这一点

创建JsonConverter并覆盖WriteJson并编写您的逻辑以仅序列化那些需要的数据。记住要覆盖CanConvertand CanWrite。您可以查看JSON.NET 中特定对象的自定义转换链接以获得一个想法

对于 ContractResolver,请参阅链接http://quickduck.com/blog/2011/08/08/overriding-the-default-serialization-behavior-in-json-net/。在此而不是使用base.CreateObjectContract( objectType );usenew JsonObjectContract( objectType );

希望这可以帮助

于 2012-11-27T12:13:19.547 回答
0

创建一个仅实现接口的新类(创建“视图模型”),使用所需字段初始化该类并返回对象是一种解决方案。

或者,如果可能,将字段标记为私有。私有字段不会被序列化。(限制字段的可见性总是一件好事)

于 2012-11-27T11:02:16.843 回答