Pourquoi le GSON utilise-t-il UNIQUEMENT champs (private, public, protected) ? Existe-t-il un moyen d'indiquer à GSON de n'utiliser que des getters et setters ?
Réponses
Trop de publicités?En général, lorsque vous sérialisez/désérialisez un objet, vous le faites pour obtenir une copie exacte de l'état de l'objet. En tant que tel, vous voulez généralement contourner l'encapsulation normalement souhaitée dans une conception OO. Si vous ne contournez pas l'encapsulation, il se peut qu'il ne soit pas possible d'obtenir un objet qui a exactement le même état après la désérialisation qu'avant la sérialisation. De plus, considérez le cas où vous ne voulez pas fournir un setter pour une propriété particulière. Comment la sérialisation/désérialisation doit-elle agir si vous travaillez à travers les getters et setters ?
Existe-t-il un moyen d'indiquer à GSON de n'utiliser que des getters et des setters ?
Pas encore.
De le document de conception :
[Il existe également de bons arguments en faveur des propriétés. Nous avons l'intention d'améliorer Gson dans une version ultérieure afin de prendre en charge les propriétés en tant que mappage alternatif pour indiquer les champs Json. Pour l'instant, Gson est basé sur les champs.
Il est possible de patcher Gson pour utiliser des récupérateurs .
Le vague aperçu de comment cela fonctionne dans notre application est que nous avons beaucoup de TypeAdapter
certaines pour des objets spécifiques de type valeur et d'autres pour des objets de type haricot, pour lesquels nous savons que la logique JavaBeans fonctionnera. Nous bloquons ensuite tous ces éléments dans un GsonBuilder
avant de créer le Gson
objet.
Malheureusement, GSON est vraiment nul pour gérer des types comme Object[]
. Nous avons surtout vu cela lorsque nous avons essayé de créer un objet JSON pour représenter les paramètres des méthodes. La solution de contournement consistait à créer des objets JSON personnalisés. TypeAdapter
qui reflètent les méthodes. (Cela signifie que vous finissez par utiliser une seule Gson
instance par méthode que vous avez l'intention d'appeler...)