Почему XMLDecoder не уважает ключевое слово transient?
Java имеет ключевое слово transient, которое используется с сериализацией по умолчанию для указания значения, которое не должно быть сериализовано. Однако если я использую XML-сериализацию с XMLDecoder, свойства, связанные с этим полем, все равно сериализуются. Я попробовал то же самое в JSON с библиотекой Gson, и переходные поля, похоже, правильно пропущены.
Есть идеи, почему?
1 ответ:
XML-кодеры / декодеры благоприятствуют
@XMLTransient
аннотация.Ключевое слово
transient
предназначено для процесса сериализации объектов java, который заканчивается последовательностью байтов. XML "сериализация" заканчивается в форматированном текстовом документе. Когда вы выбираете поле, которое не нужно сериализовать (помечая егоtransient
), могут быть разные аспекты, и поскольку выходные данные совершенно разные, вы можете выбрать разные поля, которые вы хотите исключить, и обрабатывать их самостоятельно. Например, в случае Java сериализация вы можете выбрать сериализацию abyte[]
, потому что это легко и просто. В случае 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
.