EN · DE · RU · FR · ES

#759: XmlOmitField.java

Lines: 39 · Author: Kai Reinhard · Type: Java marker annotation · Package: org.projectforge.framework.xmlstream

Что это

Маркерная аннотация — помечает поле Java-класса как не подлежащее XML-сериализации. 39 строк, из которых 21 — GPL-лицензия, 15 — импорты/объявление, и только 3 строки самого кода. Это полный аналог transient из Java Serialization API и @XmlTransient из JAXB, но для фреймворка XmlStream. Без параметров — чисто маркер. Проверяется в XmlObjectWriter.writeField() (строка 242): if (field.isAnnotationPresent(XmlOmitField.class)) continue; и в XmlObjectReader.read() (строка 471).

Почему отдельная аннотация, а не transient?

Java ключевое слово transient исключает поле из всех видов сериализации — и Java Serialization, и XStream, и XmlStream. Но иногда нужно чтобы поле участвовало в Java-сериализации (например, для кэширования в HTTP-сессии) но НЕ попадало в XML-экспорт. @XmlOmitField даёт гранулярный контроль: поле может быть НЕ-transient (участвует в Java-сериализации) но всё равно исключено из XML.

Пример: поле password в PFUserDO. Оно должно быть transient (не сериализоваться в сессию), но даже если бы не было — @XmlOmitField гарантирует что пароль никогда не попадёт в XML-экспорт данных. Двойная защита.

Отличие от default-value skipping

@XmlOmitField пропускает поле всегда, независимо от значения. Механизм default-value из @XmlField пропускает поле только если его значение равно значению по умолчанию. Это разные сценарии:

История изменений

Git log содержит только обновления копирайта и одно переименование пакета. Файл практически не менялся с момента создания — что ожидаемо для аннотации-маркера без параметров. Единственное значимое изменение: cd27dd997 — "package xstream -> xmlstream" (пакет был переименован чтобы избежать путаницы с библиотекой XStream).