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