Почему XMLDecoder не уважает ключевое слово transient?


Java имеет ключевое слово transient, которое используется с сериализацией по умолчанию для указания значения, которое не должно быть сериализовано. Однако если я использую XML-сериализацию с XMLDecoder, свойства, связанные с этим полем, все равно сериализуются. Я попробовал то же самое в JSON с библиотекой Gson, и переходные поля, похоже, правильно пропущены.

Есть идеи, почему?

1 2

1 ответ:

XML-кодеры / декодеры благоприятствуют @XMLTransient аннотация.

Ключевое слово transient предназначено для процесса сериализации объектов java, который заканчивается последовательностью байтов. XML "сериализация" заканчивается в форматированном текстовом документе. Когда вы выбираете поле, которое не нужно сериализовать (помечая его transient), могут быть разные аспекты, и поскольку выходные данные совершенно разные, вы можете выбрать разные поля, которые вы хотите исключить, и обрабатывать их самостоятельно. Например, в случае Java сериализация вы можете выбрать сериализацию a byte[], потому что это легко и просто. В случае XML может потребоваться сериализовать объект, который был использован для создания этого массива байтов, если он имеет более хорошее/более осмысленное текстовое представление.

@XMLTransient используется JAXB. Для XMLEncoder исключения поля (отметьте его переходным), вы должны установить свойство "transient" на TRUE в их PropertyDescriptor: (Источник )

BeanInfo info = Introspector.getBeanInfo(JTextField.class);
PropertyDescriptor[] propertyDescriptors =
                             info.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; ++i) {
    PropertyDescriptor pd = propertyDescriptors[i];
    if (pd.getName().equals("text")) {
        pd.setValue("transient", Boolean.TRUE);
    }
}
Это не самое элегантное решение. Альтернативой является: использование JAXB вместо XMLEncoder.