EN · DE · RU · FR · ES

#756: XmlObject.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlObject.java Java-Annotation — Klassenebenen-Marker für XmlStream-Serialisierung. 44 Zeilen. @Target(TYPE), @Retention(RUNTIME). Quelle: projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlObject.java 44 Zeilen · 10 Code · 30 Kommentare · 4 leer
Zweck: Eine Annotation auf Klassenebene — markiert eine Klasse als serialisierbar/deserialisierbar durch das XmlStream-Framework. 44 Zeilen. Dies ist das Äquivalent zu JAXBs @XmlRootElement und XStreams impliziter Konvention (jede Klasse kann serialisiert werden). Im Gegensatz dazu erfordert XmlStream eine explizite Annotation — Klassen ohne @XmlObject werden weder von XmlObjectReader noch von XmlObjectWriter verarbeitet. Dies ist eine Sicherheitsmaßnahme: Nur explizit zugelassene Klassen nehmen an der Serialisierung teil.

Einziger Parameter: alias()

Überschreibt den Namen des XML-Wurzelelements. Standardmäßig (leerer String) wird der vollqualifizierte Klassenname verwendet: org.projectforge.business.user.PFUserDO<org.projectforge.business.user.PFUserDO>. Mit Alias: @XmlObject(alias="user")<user>. Aliase werden in AliasMap (#758) während der XmlRegistry-Initialisierung registriert.

Unterschied zu @XmlField(alias): @XmlObject.alias legt den Namen des Wurzelelements fest (das Tag, das das gesamte Objekt umschließt), während @XmlField.alias einen Kind-Element- oder Attributnamen (ein bestimmtes Feld) festlegt.

Verwendung zur Laufzeit

  1. XmlRegistry durchsucht beim Start den Klassenpfad (oder die Konfiguration) und findet alle mit @XmlObject annotierten Klassen
  2. Für jede Klasse wird sie in AliasMap registriert: Klasse → Alias und Alias → Klasse
  3. XmlObjectReader.newInstance() sucht beim Auftreten eines XML-Elements die entsprechende Klasse über AliasMap.getClassForAlias(tagName)
  4. Wenn gefunden — erstellt eine Instanz über BeanHelper.newInstance() und füllt rekursiv Felder (unter Verwendung von @XmlField)
  5. Wenn nicht gefunden — gibt Status.IGNORE zurück (#760)

XmlObject vs. XStream @XStreamAlias

Wesentlicher Unterschied: @XmlObject ist nicht nur ein Alias — es ist eine explizite Erlaubnis zur Serialisierung. Eine Klasse ohne @XmlObject wird vollständig vom Prozess ausgeschlossen. XStream serialisiert standardmäßig jede Klasse — was ein Risiko unbeabsichtigter Datenlecks darstellt (z. B. Serialisierung eines Hibernate-Proxys mit Passwörtern). XmlStream ist sicherer, erfordert aber mehr manuelle Annotationsarbeit.

XmlStream-Annotationstrio

AnnotationDateiRolle
@XmlField#752Konfiguriert die Feldserialisierung (Name, Typ, Standardwerte, Format)
@XmlObject#754Aktiviert die Klasse für die Serialisierung mit Alias
@XmlOmitField#757Schließt ein Feld vollständig von der Serialisierung aus

Git-Verlauf

868d6abb7 2025 → 2026 (Aktualisierung des Copyright-Jahres)
63081666f Quellcodedatei-Header: 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 Paket xstream → xmlstream
ceb63e8a1 Quellcode-Header: (C) 2001-2021
7c79f1922 Copyright des Quell-Headers → 2020
32f634b88 Optimierung der Importe
dd5ca38ac Copyright aller Java-Datei-Header aktualisiert oder erstellt
9ebb88522 Erster Commit
Die Annotation hat ein Attribut (alias) und hat sich seit dem ersten Commit nicht geändert, abgesehen von Copyright-Aktualisierungen und der Paketumbenennung von xstream → xmlstream. Die Einfachheit ist beabsichtigt — dies ist ein Berechtigungsgate, keine Konfigurationsoberfläche.