Question

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

Était-ce utile?

La solution

Réponse 2008L'API Java "officielle" pour cela est désormais 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 2018 Noter que les modules Java EE et CORBA sont obsolètes dans SE dans JDK9 et doivent être supprimés de SE dans JDK11.Par conséquent, pour utiliser JAXB, il devra soit se trouver dans votre environnement de classe entreprise existant, regroupé par ex.serveur d'applications, ou vous devrez l'introduire manuellement.

Autres conseils

XStream est plutôt bon pour sérialiser des objets en XML sans beaucoup de configuration et d'argent !(c'est sous licence BSD).

Nous l'avons utilisé dans l'un de nos projets pour remplacer l'ancienne sérialisation Java et cela a fonctionné presque immédiatement.

Projet « Sérialisation XML simple »

Vous voudrez peut-être regarder le Sérialisation XML simple projet.C'est la chose la plus proche que j'ai trouvée du System.Xml.Serialization dans .Net.

JAXB fait partie de l'édition standard JDK version 1.6+.Donc c'est FREE et aucune bibliothèque supplémentaire à télécharger et à gérer.Un exemple simple peut être trouvé ici

XStream semble être mort.La dernière mise à jour date du 6 décembre 2008.Simple semble aussi simple et simple que JAXB, mais je n'ai trouvé aucune information de licence pour l'évaluer pour une utilisation en entreprise.

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

Si votre classe s'en tient à 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 mises en garde suivantes :

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

Par exemple, prenons 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();

Cela donnerait 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>

Beans XML fonctionne très bien si vous avez un schéma pour votre XML.Il crée des objets Java pour le schéma et crée des méthodes d'analyse faciles à utiliser.

Si vous parlez de sérialisation XML automatique des objets, consultez Castor:

Castor est un framework de liaison de données Open Source pour Java[tm].C'est le chemin le plus court entre les objets Java, les documents XML et les tables relationnelles.Castor fournit une liaison Java vers XML, une persistance Java vers SQL, etc.

Habituellement, j'utilise jaxb ou Beans XML si j'ai besoin de créer des objets sérialisables en XML.Maintenant, je peux voir ça XStream pourrait être très utile car il est non intrusif et possède une API très simple.Je vais bientôt jouer avec et je l'utiliserai probablement.Le seul inconvénient que j'ai remarqué est que je ne peux pas créer moi-même l'identifiant de l'objet pour les références croisées.

@Barak Schiller
Merci d'avoir publié le lien vers XStream !

N'oublie pas JiBX.

si tu veux un solution structurée (comme ORM) alors JAXB2 est une bonne solution.

Si vous souhaitez une sérialisation comme DOT NET, vous pouvez utiliser Persistance à long terme des composants JavaBeans

Le choix dépend de l'utilisation de la sérialisation.

public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> list)
{
    String result = "";
    if (list.size() > 0)
    {
        T tmp = list.get(0);
        String clsName = tmp.getClass().getName();
        String[] splitCls = clsName.split("\\.");
        clsName = splitCls[splitCls.length - 1];
        Field[] fields = tmp.getClass().getFields();

        for (T t : list)
        {
            String row = "";
            try {
                for (Field f : fields)
                {
                    Object value = f.get(t);
                    row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row = genXmlTag(clsName, row);

            result += row;
        }
    }

    result = genXmlTag("root", result);
    return result;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top