¿Por qué GSON usa SOLO campos (privados, públicos, protegidos)? ¿Hay alguna manera de decirle a GSON que use solo getters y setters?
Respuestas:
En términos generales, cuando serializa / deserializa un objeto, lo está haciendo para terminar con una copia exacta del estado del objeto; Como tal, generalmente desea eludir la encapsulación normalmente deseada en un diseño OO. Si no elude la encapsulación, es posible que no sea posible terminar con un objeto que tenga exactamente el mismo estado después de la deserialización que antes de la serialización. Además, considere el caso en el que no desea proporcionar un setter para una propiedad en particular. ¿Cómo debería actuar la serialización / deserialización si está trabajando con los captadores y definidores?
transient
para que no se serialicen y recalcularse a pedido.
¿Hay alguna forma de decirle a GSON que use solo getters y setters?
Aún no.
Del documento de diseño :
[E] aquí también hay buenos argumentos para respaldar las propiedades. Tenemos la intención de mejorar Gson en una última versión para admitir propiedades como un mapeo alternativo para indicar campos Json. Por ahora, Gson está basado en campos.
Es posible parchear Gson para usar getters .
El esquema vago de cómo funciona esto en nuestra aplicación es que tenemos muchas TypeAdapter
implementaciones, algunas para objetos específicos de valor y otras para objetos de estilo bean, donde sabemos que la lógica de JavaBeans funcionará. Luego colocamos todos estos en un GsonBuilder
antes de crear el Gson
objeto.
Desafortunadamente, GSON es realmente una mierda para manejar tipos como Object[]
. Principalmente vimos esto cuando intentábamos hacer un objeto JSON para representar parámetros de método. La solución alternativa fue crear TypeAdapter
instancias personalizadas que reflejen los métodos. (Esto significa que terminas usando una Gson
instancia por método que pretendes llamar ...)