XmlObjectWriter.javaДвижок сериализации фреймворка XmlStream — превращает Java-объекты в XML (dom4j Document). 387 строк. Javadoc: "A simple solution for streaming xml objects and to prevent default values from the xml output (because this feature isn't yet available in XStream)." — XStream на момент написания не умел пропускать поля со значениями по умолчанию, а для экспорта данных это критично.
Пара с XmlObjectReader: Writer сериализует Java → XML, Reader десериализует XML → Java.
ATTR_ID = "o-id" — уникальный идентификатор объекта. Writer присваивает каждому новому объекту возрастающий refIdCounterATTR_REF_ID = "ref-id" — ссылка на уже записанный объект. Если объект уже был сериализован, Writer пишет ref-id="0" вместо полного содержимогоЭтот механизм решает проблему циклических ссылок и дублирования.
writtenObjectsMap<String, Element> где ключ — className:hashCode. Это identity-based кэш (по хэш-коду), а не equals-based — два разных объекта с одинаковыми полями будут записаны оба, но один объект, встреченный дважды — только один раз.
write(Branch parent, Object obj, ...)Рекурсивный метод сериализации. Цепочка проверок: определение имени тега → deduplication check → Converter → Enum → Collection → Complex object.
Метод isDefaultType(ann, value) проверяет: равно ли значение поля значению по умолчанию из аннотации @XmlField.default*? Если да — поле не записывается. Это то, ради чего создавался XmlStream:
Boolean: по умолчанию false — все false-поля пропускаютсяDouble: сравнивается с defaultDoubleValue()Integer: сравнивается с defaultIntValue(). Магическое число MAGIC_INT_NUMBER из XmlConstantsString/Enum: сравнивается с defaultStringValue()868d6abb7 2025 → 2026 63081666f Source file headers: 2024→2025 9f874e26c MAJOR-CHANGE! Migration Integer → Long id's b6092df09 Copyright 2023 → 2024 ab45d51fa Copyright 2001-2022 → 2001-2023 5f7ef41b8 Copyright 2021 → 2022 cd27dd997 package xstream → xmlstream 24019a0f5 Eliminate DateHolder occurences 73a9755df Code cleanup (StringBuffer→StringBuilder, diamond) 32f634b88 Optimize imports a5bbdca6a Change logger to slf4j f979e8a42 MGC-UPDATE: Update auf Version 3.0.0-SNAPSHOT 9ebb88522 Initial commit
Ключевые изменения: 9f874e26c — массовая миграция идентификаторов с Integer на Long. 24019a0f5 — удаление DateHolder. cd27dd997 — пакет переименован с xstream на xmlstream; комментарий "(should be replaced by xstream later)" — автор планировал заменить на XStream, но этого не произошло.