Comment sérialiser et désérialiser des objets à l'aide de JAXB?
J'ai un problème. Je veux convertir un objet en un autre objet à l'aide de JAXB. Comme, j'ai une classe com.home.Student
, et une autre classe com.school.Student
, les deux ont les mêmes arguments, en fait les deux sont les mêmes (copier-coller), mais différentes. Je veux effectuer la conversion entre eux à l'aide de JAXB
.
Comment faire, s'il vous plaît aider moi.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer les opérations suivantes.
Remarque:
com.la maison.Étudiant
com.la maison.Statut
com.l'école.Étudiant
com.l'école.Statut
com.exemple.Demo;
JAXBElement<com.school.Student> jaxbElementB = unmarshallerB.unmarshal(sourceA, com.school.Student.class);
ne compile pasIl serait bien si vous avez inclus un code qui explique votre problème.
JAXB 101 dit que vous devez placer le droit des annotations, vous pouvez sérialiser et désérialiser correctement. Vous devriez annoter vos classes avec @XmlRootElement, @XmlElement, @XmlAttribute, etc
Par exemple:
Ensuite, vous pouvez utiliser le sérialiser l'aide de JAXB Marshaller:
Et désérialiser ainsi par Unmarshelling l'entrée ..
Assurez-vous que vous regardez la JavaDoc je l'ai mentionné ci-dessus, car il existe de nombreuses façons de le faire.
Si vous ne pouvez pas modifier vos classes, vous pouvez toujours utiliser JAXB (ou vous pouvez utiliser XStream) en Supposant que votre classe est la suivante:
Vous pouvez sérialiser en faisant:
Si vous utilisez XStream, vous pouvez faire de la sérialisation sans Annotations trop (et c'est plus contrôlable).
http://x-stream.github.io/tutorial.html
m.marshal(new JAXBElement(new QName(Student.class.getSimpleName()), Student.class, student), writer);
j'ai mis à jour le code, si vous n'avez pas d'annotations.Si votre but est simplement de convertir (assigner en fait) entre les deux, et ils sont identiques à l'exception du nom de package, je pense que vous pourriez utiliser simple réflexion. Juste itérer sur tous les champs de la source de l'objet, et de l'affecter au champ du même nom dans l'objet cible. Vaguement, comme ceci:
Remarque: je n'ai pas de compilation, ce qui est pourquoi je dis "vaguement". Vous aurez besoin d'utiliser le Terrain.isAccessible()/Champ.setAccessible(vrai) si les champs sont privés, de sorte que vous pouvez changer temporairement l'accessibilité alors que vous êtes en assignant des valeurs. Ou, vous l'écrire un peu plus complexe, le code qui utilise les setters/getters plutôt que d'utiliser directement accès sur le terrain.