2 votes

Limiter les champs de données du modèle sérialisés par l'API Web en fonction du type de retour Interface

Nous mettons à jour notre architecture afin d'utiliser un modèle d'objet unique pour le bureau, le web et le mobile qui peut être utilisé dans le modèle MVVM. J'aimerais pouvoir limiter les champs de données qui sont sérialisés par l'API Web en utilisant des interfaces sur les contrôleurs. Cela est nécessaire parce que les objets du modèle pour les mobiles sont stockés dans le stockage local HTML5 et ne transportent donc pas de données facultatives, alors qu'un client de bureau léger serait capable de stocker (et de travailler avec) plus de données.

Pour cela, un modèle implémentera les différentes interfaces qui définissent les champs de données à sérialiser et il y aura un contrôleur spécifique à l'interface.

Le problème est que l'API Web sérialise toujours chaque champ du modèle, même s'il ne fait pas partie de l'interface renvoyée. Comment pouvons-nous sérialiser uniquement les champs de l'interface renvoyée ?

2voto

Maxim Points 5883

J'ai une idée de comment automatiser le processus de sérialisation d'une interface spécifique au lieu de l'objet entier.
J'ai écrit une bibliothèque contenant un tel code (pour l'instant, ce morceau de code est partagé sur github gist). Elle expose une méthode d'extension nommée ToDynamic .

public static dynamic ToDynamic<T>(this T value, bool deep = true);

Utilisez un T spécifique pour extraire les champs disponibles dans ce type de T.
Dans l'exemple suivant, T sera déterminé automatiquement.
Ainsi, seuls les membres de l'IClub seront extraits et sérialisés :

IReadOnlyList<IClub> clubs = retrieving.GetClubs(page, size, criteria);

return this.Request.CreateResponse(HttpStatusCode.OK, clubs.Select(item => item.ToDynamic()));

1voto

keyr Points 970

Je pense que vous pouvez le faire avec JsonConverter ou en utilisant ContractResolver.

Créer JsonConverter et remplacer le WriteJson et écrire votre logique pour sérialiser uniquement les données qui sont nécessaires. N'oubliez pas de remplacer CanConvert et aussi CanWrite . Vous pouvez consulter le lien suivant Conversion personnalisée d'objets spécifiques en JSON.NET pour se faire une idée

Pour ContractResolver, voir le lien http://quickduck.com/blog/2011/08/08/overriding-the-default-serialization-behavior-in-json-net/ . Dans ce cas, au lieu d'utiliser base.CreateObjectContract( objectType ); utiliser new JsonObjectContract( objectType );

J'espère que cela vous aidera

0voto

lboshuizen Points 1754

La solution consiste à créer une nouvelle classe qui implémente uniquement l'interface (en créant un "viewmodel"), à initialiser cette classe avec les champs nécessaires et à renvoyer l'objet.

Ou si possible, marquez les champs comme privés. Les champs privés ne sont pas sérialisés. (limiter la visibilité des champs est toujours une bonne chose)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X