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 ?
Réponses
Trop de publicités?É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 .
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.
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).
J'ai effectué des benchmarks sur différentes solutions pour cloner un objet JAXB. Voici quelques résultats :
-
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 publiquementObject.clone()
. Malheureusement, cela n'a pas été intégré à Maven central (pour l'instant). -
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(); }
-
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()); }
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/
- Réponses précédentes
- Plus de réponses