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