Quel est l'analogue Java de la sérialisation XML de .NET?
Quel est l'analogue Java de la sérialisation XML de .NET?
Réponses:
2008 Answer L'API Java "officielle" pour cela est maintenant JAXB - API Java pour la liaison XML. Voir le didacticiel d'Oracle . L'implémentation de référence se trouve sur http://jaxb.java.net/
Mise à jour 2018 Notez 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 être dans votre environnement de classe entreprise existant fourni par votre serveur d'application, par exemple, soit vous devrez l'introduire manuellement.
XStream est assez bon pour sérialiser des objets en XML sans trop 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.
Vous voudrez peut-être examiner le projet de sérialisation XML simple . C'est la chose la plus proche que j'ai trouvée de la System.Xml.Serialization dans .Net.
JAXB fait partie de l'édition standard de JDK version 1.6+. Il en est ainsi 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, peuvent 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 d'un schéma. Avec les mises en garde suivantes:
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();
Se traduirait par 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>
java.beans.XMLDecoder
avec les données fournies par l'utilisateur peut introduire des vulnérabilités d'exécution de code arbitraire dans votre code.
XMLBeans 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 la 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 la liaison Java vers XML, la persistance Java vers SQL, etc.
Habituellement, j'utilise jaxb ou XMLBeans si j'ai besoin de créer des objets sérialisables en XML. Maintenant, je peux voir que XStream pourrait être très utile car il n'est pas intrusif et possède une API vraiment simple. Je vais bientôt jouer avec et l'utiliser probablement. Le seul inconvénient que j'ai remarqué est que je ne peux pas créer mon propre identifiant d'objet pour les références croisées.
@Barak Schiller
Merci d'avoir publié le lien vers XStream!
si vous voulez une solution structurée (comme ORM) alors JAXB2 est une bonne solution.
Si vous voulez une sérialisation comme DOT NET, vous pouvez utiliser la 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;
}