104 votes

Sérialisation XML en Java ?

Quel est l'équivalent en Java de la sérialisation XML de .NET ?

8 votes

Ah, le bon vieux temps où les questions d'une seule ligne comme celle-ci étaient les bienvenues sur SO. Tellement utile. Sans toutes ces bêtises de type "Qu'avez-vous essayé ?" ou "Donnez des détails" que les gens aiment lire aujourd'hui.

82voto

Cheekysoft Points 16532

Réponse 2008 L'API Java "officielle" pour cela est maintenant JAXB - Java API for XML Binding. Voir Tutoriel par Oracle . L'implémentation de référence se trouve à http://jaxb.java.net/

Mise à jour de 2018 Notez que les modules Java EE et CORBA sont dépréciés dans SE dans JDK9 et seront supprimés de SE dans JDK11 . Par conséquent, pour utiliser JAXB, il faudra soit l'intégrer à votre environnement de classe d'entreprise existant, en le regroupant avec votre serveur d'applications, par exemple, soit l'introduire manuellement.

2 votes

C'est vrai, JAXB est certainement la meilleure option !

1 votes

JAXB a été supprimé des distributions standard de Java à partir de Java 10, ce qui en fait désormais une bibliothèque que vous devez regrouper avec votre application si vous la voulez, à moins que vous n'opériez dans un contexte qui la regroupe déjà pour vous.

71voto

Barak Schiller Points 800

XStream est assez bon pour sérialiser un objet en XML sans beaucoup de configuration et d'argent ! (il est sous licence BSD).

Nous l'avons utilisé dans un de nos projets pour remplacer la bonne vieille java-serialization et cela a fonctionné presque immédiatement.

3 votes

Très utile, il peut cependant avoir des problèmes sur les structures d'arbres complètes telles que JGraph avec des objets de nœuds qui ne sont pas des chaînes.

0 votes

Plus simple et plus efficace que les autres solutions

0 votes

J'aime bien XStream. La seule chose que je ne comprends pas, c'est pourquoi un caractère est ajouté avant le véritable XML.

17voto

ARKBAN Points 1388

"Projet "Sérialisation simple XML

Vous pouvez consulter le Sérialisation XML simple projet. C'est ce que j'ai trouvé de plus proche de System.Xml.Serialization dans .Net.

0 votes

Il nécessite toutefois des annotations de mappage pour chaque champ.

1 votes

C'est faux, je ne l'exige pas. Vous pouvez modifier le comportement par défaut et il n'utilisera que les champs présents.

1 votes

Je soutiens de tout cœur "Simple" également. Je l'ai utilisé sur quelques projets avec beaucoup de succès. "Simple" est en effet beaucoup plus simple que JAXB. Il est le plus approprié lorsque vous avez des besoins relativement simples : Vous obtenez des objets qui doivent être écrits sur un support de stockage pour être ensuite réhydratés en tant qu'objets à nouveau. JAXB a beaucoup plus de fonctionnalités et de flexibilité, mais c'est une sorte de "80/20", la plupart du temps, dans la plupart des projets, vous n'avez besoin que du sous-ensemble simple de fonctionnalités.

13voto

so_mv Points 1859

JAXB fait partie de l'édition standard du JDK version 1.6+. Il s'agit donc FREE et aucune bibliothèque supplémentaire à télécharger et à gérer. Un exemple simple peut être trouvé aquí

XStream semble être mort. La dernière mise à jour date du 6 décembre 2008. Simple semble aussi facile et plus simple que JAXB mais je n'ai pas pu trouver d'informations sur les licences pour l'évaluer dans le cadre d'une utilisation en entreprise.

4 votes

XStream n'est pas mort, il est juste mature et stable - ce qui signifie qu'il n'y a pas grand-chose à ajouter à la fonctionnalité de base. Il en va de même pour la mise en œuvre de référence de JAXB, qui n'a pas connu beaucoup d'activité au cours des deux dernières années.

0 votes

Jaxb craint ... je n'ai pas réussi à le faire fonctionner correctement ... xstream fonctionne beaucoup mieux ... mais pas très bien pour les changements de structure de classe.

8voto

Mishax Points 1562

Il convient de mentionner que depuis la version 1.4, Java dispose des classes java.beans.XMLEncoder et java.beans.XMLDecoder. Ces classes effectuent un encodage XML qui est au moins très comparable à la sérialisation XML et qui, dans certaines circonstances, pourrait faire l'affaire pour vous.

Si votre classe respecte la spécification JavaBeans pour ses getters et setters, cette méthode est simple à utiliser et vous n'avez pas besoin de schéma. Avec les réserves suivantes :

  • Comme pour la sérialisation normale de Java
    • codage et décodage exécutés sur un InputStream et un OutputStream
    • Le processus utilise les méthodes familières writeObject et readObject.
  • Contrairement à la sérialisation normale de Java
    • l'encodage mais aussi le décodage provoquent l'invocation de constructeurs et d'initialisateurs
    • l'encodage et le décodage fonctionnent indépendamment du fait que votre classe implémente ou non Serializable
    • les modificateurs transitoires ne sont pas pris en compte
    • ne fonctionne que pour les classes publiques, qui ont des constructeurs publics.

Par exemple, prenez la déclaration suivante :

public class NPair {
  public NPair() { }
  int number1 = 0;
  int number2 = 0;
  public void setNumber1(int value) { number1 = value;}
  public int getNumber1() { return number1; }
  public void setNumber2(int value) { number2 = value; }
  public int getNumber2() {return number2;}
}

Exécution de ce code :

NPair fe = new NPair();
fe.setNumber1(12);
fe.setNumber2(13);
FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
xe1.writeObject(fe);
xe1.close();

Le résultat serait le fichier suivant :

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

0 votes

Sachez que l'utilisation de java.beans.XMLDecoder avec des données fournies par l'utilisateur peut introduire des vulnérabilités d'exécution de code arbitraire dans votre code.

0 votes

Beaucoup de XML inutile est généré par la classe XMLEncoder. Il suffit de regarder la sortie volumineuse...

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