LuccaSA / RestDrivenDomain

8 stars 1 forks source link

Serialization RDD : Native ou custom ? #177

Open Poltuu opened 6 years ago

Poltuu commented 6 years ago

J'aimerais ici ouvrir le sujet de la sérialization RDD, avec notamment l'idée de modifier en profondeur l'existant (basé notamment sur les ISerializer, IRddSerializer et ISerializerProvider) versus la sérialization native de aspnet core, à savoir newtonsoft.

Cette question est soulevée par raph et la PR https://github.com/LuccaSA/RestDrivenDomain/pull/141/files. J'ai eu pour mission de découper cette PR en deux morceaux, à savoir la partie sérialization vs le reste. J'y travaille depuis 10 jours, et j'ai une version qui "marche". Arrivée à ce point, il m'a semblé nécessaire de discuter de ce que j'ai appris lors de ce développement, et ce que je pense des implications d'une telle modification afin que tout le monde soit bien d'accord.

Accrochez vos ceintures, j'ai beaucoup de choses à dire.

Méthode existante : description, avantages et inconvénients

Description

La méthode existante concernant la sérialization est la suivante:

Avantages

Inconvénients

Méthode suggérée: description, avantages et inconvénients

La méthode suggérée consiste en l'application des filtres de visibilité demandés par les fields directement au moment de la serialization par newtonsoft. Je vais entrer dans les détails techniques de ce qu'il se passerait, sachant que je ne décris ici ni l'implémentation choisie par raph, ni la mienne, mais l'essentiel de ce qu'une telle implémentation doit faire:

Avantages

Inconvénients

Implémentation

J'ai implémenté une version sur cette branche https://github.com/LuccaSA/RestDrivenDomain/tree/newtonsoft_serializaer qui marche complètement, càd qui est quasi iso-comportement avec l'existant, car elle prend en compte:

Je pense que ma version est plus aboutie que celle de raph, car elle va plus loin dans le support de fonctionnalités existantes. Je l'ai développé en me souciant des possibilités d'extension du système, notamment pour obtenir une couverture similaire de l'existant. Par contre, elle ne permet pas le pilotage de la serialization via contentype negociation.

Néanmoins, après avoir travaillé 10 jours dessus et essayé de très très très nombreuses versions, je ne suis pas satisfait du résultat final, pour des raisons diverses:

Conclusion

Face à ce constat, je pense qu'en l'état, changer de système de sérialization est une mauvaise idée. Dans l'avenir, ce système peut aller dans deux directions opposées pour résoudre les vrais problèmes mentionnés plus haut:

Comment me faire changer d'avis

2 méthodes:

ou

nfaugout-lucca commented 6 years ago

Merci pour ce résumé, ça me servira au moins pour le CIR 2018 ;)

Si je peux ajouter des pistes pour pencher pour l'une ou l'autre solution, les voici :

Je pense que c'est trop tôt pour mettre ces contraintes dans RDD v3 et qu'on peut continuer à en discuter pour RDD v4 par ex. Cela correspondra sans doute avec du tooling pour la mise en cache HTTP & co, qui va de pair avec le fait de demander aux applis de faire x10 en appels HTTP !

rducom commented 6 years ago

@Poltuu je reprends tes points :

la sérialization trackée (guidée par les fields) n'est pas un standard, et newtonsoft n'a pas été développé dans cette direction, avec cette idée à l'esprit.

J'utilise sur https://github.com/LuccaSA/RestDrivenDomain/pull/141 la propriété ShouldSerialize de chaque JsonProperty, de façon à piloter si oui ou non une propriété doit être sérialisée. Ceci permet à la fois de ne pas altérer la gestion de cache de NewtonSoft.Json, et de piloter la serialization trackée par fields.

la sérialization d'un objet est censé exposer l'objet entrant, pas le modifier ou l’utiliser, ce qui rend certaines fonctionnalités disponibles aujourd’hui compliquées ou impossibles.

Peux-tu liste les fonctionnalités auxquelles tu pense ?

les hautes performances de newtonsoft sont liées à une mise en cache de nombreux aspects de la serialization. Cela se marie mal avec le besoin de résultats dynamiques. / une très grande partie des performances proposées par newtonsoft est jeté à la poubelle par cette ligne

Comme dit plus haut, l'approche sur https://github.com/LuccaSA/RestDrivenDomain/pull/141 n'altère pas la mise en cache de Newtonsoft.

les possibilités d'override sont donc plus limitées quand on les couple avec les fields.

C'est pas clair, peux-tu développer ?

l'extensibilité d'un tel système est extrêmement faible. Par exemple, après avoir développé toutes les fonctionnalités, j'ai essayé de développer la dernière, à savoir permettre l'affichage de toutes les propriétés d'un objet si son type mère est un type reconnu par RDD comme un type exposé

Si je comprends biens, là il s'agit de piloter les fields par default. Dans ce cas, cette problématique est externe à la serialization. Je vais créer une issue et proposer une API à ce sujet dans la journée.

Globalement, l'approche que j'ai adoptée sur https://github.com/LuccaSA/RestDrivenDomain/pull/141 est de modifier au minimum le standard, de façon à permettre le minimum d'overhead, et d'accéder aux features natives de Newtonsoft.Json.

L'aspect qui m'étonne le plus dans ton message concerne les features de customisation de la serialization. Je ne vois pas ce que la serialization Rdd peut faire actuellement et qu'un JsonConverter ne peut pas faire.