Страницы

Поиск по вопросам

пятница, 21 декабря 2018 г.

Ошибочная сериализация полей с Gson

У меня в обьекте есть поле:
@SerializedName("CommentPhotoes") @Expose(serialize = false) private ArrayList commentPhotos;
Мне это поле нужно распарсить когда я считываю этот объект из строки, но когда я его обратно сериализую в строку, это поле не должно туда попасть.
Проблема заключается в том что при сериализации объекта - это поле тоже сериализуется. При чем тоже самое касается и десериализации.
В чем может быть проблема, может я неправильно использую эти аннотации?


Ответ

По умолчанию наличие аннотации @Expose ни на что не влияет. Поэтому при создании объекта Gson с помощью GsonBuilder нужно явно указать, как обрабатывать эти аннотации.
Возможны варианты:
Помечать нужные поля этой аннотацией Помечать игнорируемые поля этой аннотацией Использовать модификатор transient вместо аннотаций
Подробнее:
Помечаем поля, которые хотим сериализовать/десериализовать аннотацией @Expose, при создании Gson объекта говорим, что поля без этой аннотации надо игнорировать:
Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() .create(); Помечаем поля, которые хотим игнорировать и в сериализации и в десериализации аннотацией @Expose, при создании Gson объекта добавляем ExclusionStrategies
Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getAnnotation(Exclude.class) != null; }
@Override public boolean shouldSkipClass(Class c) { return false; } }) .create();
Чтобы исключить поля только в сериализации или только в десериализации нужно добавлять аннотацию @Expose с параметром serialize=false или deserialize=false
class Book { // игнорируется только при сериализации @Expose(serialize = false) String field1; // игнорируется только при десериализации @Expose(deserialize = false) String field2; }
и при создании Gson объекта настроить правильное исключение полей с этими аннотациями:
new GsonBuilder() .addSerializationExclusionStrategy(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { Expose expose = f.getAnnotation(Expose.class); return expose != null && !expose.serialize(); }
@Override public boolean shouldSkipClass(Class c) { return false; } }) .addDeserializationExclusionStrategy(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { Expose expose = f.getAnnotation(Expose.class); return expose != null && !expose.deserialize(); }
@Override public boolean shouldSkipClass(Class c) { return false; } }) .create(); Также чтобы исключить поле можно добавить к нему модификатор transient
class Book { transient String name; }

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

Отправить комментарий