Почему Джексон также сериализует переходный член?

Я сериализую POJO в JSON, используя Jackson 2.1.4, но я хочу игнорировать конкретное поле из сериализации. Я использовал переходный процесс, но все же он сериализует этот элемент.

public class TestElement {

    int x;

    private transient String y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public String getY() {
        return y;
    }

    public void setY(String y) {
        this.y = y;
    }
}

Я сериализуюсь следующим образом:

public static void main(String[] args) throws JsonProcessingException {
    TestElement testElement = new TestElement();
    testElement.setX(10);
    testElement.setY("adasd");
    ObjectMapper om = new ObjectMapper();
    String serialized = om.writeValueAsString(testElement);
    System.err.println(serialized);
}

Пожалуйста, не предлагайте @JsonIgnore, так как я не хочу привязывать свою модель к конкретным аннотациям Jackson. Можно ли это сделать только с помощью переходного процесса? Есть ли какой-либо API в объектной маске для настроек видимости?

Ответы

Ответ 1

Причина, по которой Джексон выполняет сериализацию члена transient, объясняется тем, что геттеры используются для определения того, что сериализуется, а не самого члена, - и поскольку y имеет публичный getter, который получает сериализацию. Если вы хотите изменить это значение по умолчанию и использовать поля использования Джексона - просто выполните:

om.setVisibilityChecker(
om.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE));

Другой способ игнорировать свойство при сериализации - это сделать это непосредственно в классе:

@JsonIgnoreProperties(value = { "y" })
public class TestElement {
...

И другой способ находится непосредственно в поле:

public class TestElement {

    @JsonIgnore
    private String y;
...

Надеюсь, это поможет.

Ответ 2

Новый способ остановить Джексона от сериализации и десериализации - вызвать mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true).

Ответ 3

Я не могу комментировать так, чтобы завершить предыдущий ответ здесь, изменив (теперь) устаревший метод setVisibilityChecker и добавив отсутствующее предложение для булевых:

mapper.setVisibility(
    mapper.getSerializationConfig().
    getDefaultVisibilityChecker().
    withFieldVisibility(JsonAutoDetect.Visibility.ANY).
    withGetterVisibility(JsonAutoDetect.Visibility.NONE).
    withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
);