EN · DE · RU · FR · ES

#755: XmlObjectReader.java

Строк: 514 · Автор: Kai Reinhard · Тип: Java — движок десериализации XmlStream · Библиотека: dom4j

Что это

Ядро десериализации фреймворка XmlStream — превращает XML (в виде dom4j Element дерева) обратно в Java-объекты. 514 строк. Это самый большой файл в XmlStream-фреймворке. Javadoc: "Parses objects serialized by the XmlObjectWriter. Uses the dom4j." Работает в паре с XmlObjectWriter.

Архитектура — state machine с backtracking

Reader — это stateful объект (в отличие от stateless Writer):

Входные точки — два метода read()

read(String xml) — публичный API

Принимает сырую XML-строку. Парсит через XmlHelper.fromString(). Очищает состояние. После чтения запускает checkForIgnoredElements().

read(Element el) — внутренний API

По имени тега находит класс (через getClass()), вызывает рекурсивный read(Class, Element, ...).

Трёхуровневый поиск класса — getClass(String)

  1. AliasMap (свой): this.aliasMap.getClassForAlias(name)
  2. XmlRegistry (глобальный): xmlRegistry.getClassForAlias(name)
  3. Class.forName() (fallback): для обратной совместимости со старыми XML с FQCN

Основной рекурсивный метод — read(Class, Element, attrName, attrValue)

Цепочка проверок типа: Reference check → Converter check → Enum check (с toUpperCase fallback) → Collection check → Complex object (через BeanHelper.newInstance()).

Хуки для подклассов — Template Method

initialize(Class) — предварительное сканирование

Рекурсивно обходит дерево типов для предварительной регистрации @XmlObject-классов в AliasMap. Использует processed Set для предотвращения бесконечной рекурсии.

Git History

868d6abb7 2025 → 2026
63081666f Source file headers: 2024→2025
a72903e36 StringBuffer → StringBuilder
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
73b0be50b commons.collections → commons.collections4
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 package xstream → xmlstream
73a9755df Code cleanup (StringBuffer→StringBuilder, diamond)
32f634b88 Optimize imports
000ca723d Remove pointless boolean expressions
a5bbdca6a Change logger to slf4j
f979e8a42 MGC-UPDATE: Update auf Version 3.0.0-SNAPSHOT
9ebb88522 Initial commit

Ключевые изменения: миграция StringBuffer→StringBuilder, переход на commons-collections4, логирование SLF4J.