web-dev-qa-db-fra.com

Pourquoi GSON utilise-t-il des champs et non des getters / setters?

Pourquoi GSON utilise-t-il les champs UNIQUEMENT (privés, publics, protégés)? Existe-t-il un moyen de dire à GSON de n'utiliser que des getters et setters?

71
Zemzela

De manière générale, lorsque vous sérialisez/désérialisez un objet, vous le faites pour vous retrouver avec 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 peut ne pas être possible de se retrouver avec un objet qui a exactement la même état après la désérialisation comme avant la sérialisation. En outre, considérez le cas où vous ne souhaitez pas fournir de setter pour une propriété particulière. Comment la sérialisation/désérialisation doit-elle agir si vous travaillez avec les getters et setters?

90
Chris Shaffer

Existe-t-il un moyen de dire à GSON de n'utiliser que des getters et setters?

Pas encore.

De le document de conception :

[T] voici également de bons arguments pour supporter les propriétés. Nous avons l'intention d'améliorer Gson dans une dernière version pour 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.

24
Programmer Bruce

Il est possible de patcher Gson en tiliser des getters .

4
Jimmy

Le vague aperçu de la façon dont cela fonctionne dans notre application est que nous avons beaucoup d'implémentations TypeAdapter - certaines pour des objets de valeur spécifiques et d'autres pour des objets de style bean où nous savons que la logique JavaBeans fonctionnera. Nous les bloquons ensuite sur un GsonBuilder avant de créer l'objet Gson.

Malheureusement, GSON est vraiment nul à gérer des types comme Object[]. Nous l'avons vu principalement lorsque nous essayions de créer un objet JSON pour représenter les paramètres de la méthode. La solution de contournement consistait à créer des instances TypeAdapter personnalisées qui reflètent les méthodes. (Cela signifie que vous finissez par utiliser une instance de Gson par méthode que vous avez l'intention d'appeler ...)

0
Trejkaz