9 votes

Comment cloner un objet JAXB ?

J'ai quelques objets jaxb (instanciés à partir de code généré à partir de xsd par jaxb) que je dois cloner. La classe Jaxb ne semble pas fournir une interface permettant de le faire facilement. Je ne peux pas modifier manuellement la classe et je ne peux pas l'étendre - je dois donc créer une méthode d'aide/utilité pour le faire. Quelle est la meilleure approche ?

8voto

ykaganovich Points 8497

Étant donné l'objectif de JAXB, je pense que le moyen le plus simple serait de marshaller votre objet en XML et de le démarshaller en retour.

Beaucoup d'autres discussions sur Google .

FAQ JAXB suggère beanlib .

Il y a aussi discussion (ainsi qu'un lien pour télécharger) d'un plugin Cloneable sous jaxb2-commons, bien que je ne trouve aucune référence sur la page du projet.

3voto

Boris Points 979

Vous devriez essayer cc-xjc qui est disponible sur sourceforge. Une de ses fonctionnalités est de générer des constructeurs clone() et copy.

3voto

lexicore Points 7723

Vous pouvez utiliser le Plugin copiable . Il génère des méthodes de copie/clonage en profondeur (qui peuvent même être personnalisées avec des stratégies).

3voto

Lukas Eder Points 48046

J'ai effectué des benchmarks sur différentes solutions pour cloner un objet JAXB. Voici quelques résultats :

  1. Utilisation de plugin xjc-clone de mofokom semble être la solution la plus rapide. Il suffit de laisser tous vos artefacts générés mettre en œuvre Cloneable et remplace publiquement Object.clone() . Malheureusement, cela n'a pas été intégré à Maven central (pour l'instant).

  2. Génération de Serializable et les sérialiser/désérialiser vers un flux fictif est 10 fois plus lent que l'utilisation des mécanismes de clonage de Java :

    public <T extends Serializable> T clone(T jaxbObject) {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      ObjectOutputStream o = new ObjectOutputStream(out);
      o.writeObject(jaxbObject);
      o.flush();
    
      ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
      ObjectInputStream i = new ObjectInputStream(in);
      return (T) i.readObject();
    }
  3. Marshaller/démarshaller les objets JAXB est à nouveau 5 fois plus lent que de les sérialiser/désérialiser. C'est pourquoi ykaganovich's suggère une solution :

    public <T extends Serializable> T clone(T jaxbObject) {
      StringWriter xml = new StringWriter();
      JAXB.marshal(jaxbObject, xml);
      StringReader reader = new StringReader(xml.toString());
      return JAXB.unmarshal(reader, jaxbObject.getClass());
    }

1voto

Martin Vysny Points 559

Nous avons utilisé le plugin jaxb2-basics - il est disponible dans le repo Maven, n'ajoute qu'une seule dépendance et peut également être utilisé pour générer d'autres choses utiles : equals, hashCode, toString, valeurs par défaut, etc. Veuillez consulter ce lien pour plus de détails : http://pragmaticintegrator.wordpress.com/2012/11/20/cloning-a-jaxb-object/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X