EN · DE · RU · FR · ES

#756 : XmlObject.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlObject.java Annotation Java — marqueur au niveau de la classe pour la sérialisation XmlStream. 44 lignes. @Target(TYPE), @Retention(RUNTIME). Source : projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlObject.java 44 lignes · 10 code · 30 commentaires · 4 vides
Objectif : Une annotation au niveau de la classe — marque une classe comme sérialisable/désérialisable par le framework XmlStream. 44 lignes. C'est l'équivalent de @XmlRootElement de JAXB et de la convention implicite de XStream (toute classe peut être sérialisée). Contrairement à eux, XmlStream exige une annotation explicite — les classes sans @XmlObject ne seront traitées ni par XmlObjectReader ni par XmlObjectWriter. Il s'agit d'une mesure de sécurité : seules les classes explicitement autorisées participent à la sérialisation.

Paramètre unique : alias()

Remplace le nom de l'élément racine XML. Par défaut (chaîne vide), le nom de classe complet est utilisé : org.projectforge.business.user.PFUserDO<org.projectforge.business.user.PFUserDO>. Avec un alias : @XmlObject(alias="user")<user>. Les alias sont enregistrés dans AliasMap (#758) lors de l'initialisation de XmlRegistry.

Différence avec @XmlField(alias) : @XmlObject.alias définit le nom de l'élément racine (la balise qui encapsule l'objet entier), tandis que @XmlField.alias définit le nom d'un élément enfant ou d'un attribut (un champ spécifique).

Utilisation à l'exécution

  1. XmlRegistry au démarrage analyse le classpath (ou la configuration) et trouve toutes les classes annotées avec @XmlObject
  2. Pour chaque classe, l'enregistre dans AliasMap : Classe → alias et alias → Classe
  3. XmlObjectReader.newInstance() lors de la rencontre d'un élément XML recherche la classe correspondante via AliasMap.getClassForAlias(tagName)
  4. Si trouvée — crée une instance via BeanHelper.newInstance() et remplit récursivement les champs (en utilisant @XmlField)
  5. Si non trouvée — retourne Status.IGNORE (#760)

XmlObject vs. XStream @XStreamAlias

Différence clé : @XmlObject n'est pas seulement un alias — c'est une autorisation explicite pour la sérialisation. Une classe sans @XmlObject est totalement exclue du processus. XStream sérialise par défaut n'importe quelle classe — créant un risque de fuite de données accidentelle (par exemple, sérialiser un proxy Hibernate avec des mots de passe). XmlStream est plus sûr mais nécessite plus de travail manuel d'annotation.

Le trio d'annotations XmlStream

AnnotationFichierRôle
@XmlField#752Configurer la sérialisation des champs (nom, type, valeurs par défaut, format)
@XmlObject#754Activer la classe pour la sérialisation avec alias
@XmlOmitField#757Exclure complètement un champ de la sérialisation

Historique Git

868d6abb7 2025 → 2026 (mise à jour année copyright)
63081666f En-têtes fichiers source : 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 package xstream → xmlstream
ceb63e8a1 En-tête code source : (C) 2001-2021
7c79f1922 Copyright de l'en-tête source → 2020
32f634b88 Optimiser les imports
dd5ca38ac Copyright de tous les en-têtes de fichiers Java mis à jour ou créés
9ebb88522 Commit initial
L'annotation a un attribut (alias) et n'a pas changé depuis le commit initial au-delà des mises à jour de copyright et du renommage du package xstream → xmlstream. La simplicité est intentionnelle — il s'agit d'une porte d'autorisation, non d'une surface de configuration.