Android — Как включить переходное поле в сериализованный объект с помощью GSON?

#android #gson #retrofit2

#Android #gson #retrofit2

Вопрос:

Я использую GSON с модификацией для отправки объекта JSON в теле запроса. Я хочу включить переходные поля в сериализацию, поэтому я вызвал excludeFieldsWithModifiers(Модификатор.СТАТИЧЕСКИЕ), но они по-прежнему не включены в тело запроса JSON.

         // Retrofit Initialization
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.excludeFieldsWithoutExposeAnnotation();
        gsonBuilder.excludeFieldsWithModifiers(Modifier.STATIC);

        retrofitBuilder = new Retrofit.Builder();
        retrofitBuilder.baseUrl(BASE_URL);
        retrofitBuilder.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()));
        Retrofit retrofit = retrofitBuilder.build();

        // Field to be serialized
        @Expose(deserialize = false, serialize = true)
        @SerializedName("Name")
        private transient String name;
  

Комментарии:

1. Ммм… Весь смысл transient ключевого слова заключается в том, чтобы сообщить сериализаторам, что поле не должно быть сериализовано. «Включить переходные поля в сериализацию» — это противоречивое утверждение. Если вы хотите, чтобы поле было сериализовано, удалите transient модификатор. Иначе это не сработает.

2. Я использую ключевое слово transient, потому что я сериализую объект и сохраняю его также в файле, и я не хочу, чтобы это поле сериализовалось в этом случае. И согласно этому руководству , метод excludeFieldsWithModifiers(модификатор. СТАТИЧЕСКИЙ) должен исключать переменные только с модификатором «static».

3. Я исправляюсь. Похоже, что ваш код должен работать так, как вы ожидаете. Вам нужно получить некоторую наглядность в процессе сериализации. Я просмотрел Gson, чтобы узнать, как вы можете отлаживать / отслеживать сериализацию, но я ничего не смог найти. Я полагаю, вы могли бы загрузить исходный код и отладить его таким образом, но это звучит болезненно. Извиняюсь за грубость.

Ответ №1:

Используйте ключевое слово transient

  transient public Drawable icon;