Почему GSON использует поля ТОЛЬКО (частные, общедоступные, защищенные)? Есть ли способ сказать GSON использовать только геттеры и сеттеры?
Почему GSON использует поля, а не геттеры/сеттеры?
Ответ 1
Вообще говоря, когда вы сериализуете/десериализуете объект, вы делаете это, чтобы получить точную копию состояния объекта; Таким образом, вы обычно хотите обходить инкапсуляцию, обычно желаемую в OO-дизайне. Если вы не обходите инкапсуляцию, может оказаться невозможным получить объект, который имеет то же самое состояние после десериализации, как это было до сериализации. Кроме того, рассмотрите случай, когда вы не хотите предоставлять сеттер для определенного свойства. Как следует выполнять сериализацию/десериализацию, если вы работаете через геттеры и сеттеры?
Ответ 2
Есть ли способ сказать GSON использовать только геттеры и сеттеры?
Пока нет.
От проект doc:
[T] здесь являются хорошими аргументами для поддержки свойств. Мы намерены усилить Gson в последней версии, чтобы поддерживать свойства как альтернативное отображение для указания полей Json. На данный момент Gson основан на полях.
Ответ 3
Можно поменять Gson на использовать getters.
Ответ 4
Смутное описание того, как это работает в нашем приложении, состоит в том, что у нас есть много реализаций TypeAdapter
- некоторые для конкретных объектов, подобных значению, а некоторые для объектов bean -style, где мы знаем, что логика JavaBeans будет работать. Затем мы застреваем все это на GsonBuilder
перед созданием объекта Gson
.
К сожалению, GSON действительно дерьмо при обработке типов, таких как Object[]
. В основном мы это видели, когда пытались сделать объект JSON для представления параметров метода. Обходной путь для этого заключался в создании пользовательских экземпляров TypeAdapter
, которые отражают методы. (Это означает, что вы в конечном итоге используете один экземпляр Gson
для каждого метода, который вы намереваетесь вызывать...)