Was ist das Java-Analogon der XML-Serialisierung von .NET?
Was ist das Java-Analogon der XML-Serialisierung von .NET?
Antworten:
2008 Antwort Die "offizielle" Java-API hierfür ist jetzt JAXB - Java API für XML-Bindung. Siehe Tutorial von Oracle . Die Referenzimplementierung befindet sich unter http://jaxb.java.net/.
Update 2018 Beachten Sie, dass die Java EE- und CORBA-Module in SE in JDK9 veraltet sind und in JDK11 aus SE entfernt werden müssen . Um JAXB verwenden zu können, muss es sich entweder in Ihrer vorhandenen Enterprise-Class-Umgebung befinden, die von Ihrem z. B. App-Server gebündelt wird, oder Sie müssen es manuell einspielen.
XStream ist ziemlich gut darin, Objekte ohne viel Konfiguration und Geld in XML zu serialisieren! (Es ist unter BSD-Lizenz).
Wir haben es in einem unserer Projekte verwendet, um die einfache alte Java-Serialisierung zu ersetzen, und es hat fast sofort funktioniert.
Vielleicht möchten Sie sich das Simple XML Serialization- Projekt ansehen . Es ist das, was ich der System.Xml.Serialization in .Net am nächsten gefunden habe.
JAXB ist Teil der JDK Standard Edition Version 1.6+. Es gibt also FREE
keine zusätzlichen Bibliotheken zum Herunterladen und Verwalten. Ein einfaches Beispiel finden Sie hier
XStream scheint tot zu sein. Das letzte Update war am 6. Dezember 2008. Es
Simple
scheint so einfach und einfacher zu sein wie JAXB, aber ich konnte keine Lizenzinformationen finden, um es für den Unternehmensgebrauch auszuwerten.
Erwähnenswert ist, dass Java seit Version 1.4 die Klassen java.beans.XMLEncoder und java.beans.XMLDecoder hatte. Diese Klassen führen eine XML-Codierung durch, die zumindest sehr gut mit der XML-Serialisierung vergleichbar ist und unter bestimmten Umständen den Trick für Sie erledigt.
Wenn sich Ihre Klasse an die JavaBeans-Spezifikation für ihre Getter und Setter hält, ist diese Methode einfach zu verwenden und Sie benötigen kein Schema. Mit folgenden Einschränkungen:
Nehmen Sie zum Beispiel die folgende Erklärung:
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;}
}
Ausführen dieses Codes:
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();
Würde zu folgender Datei führen:
<?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
mit vom Benutzer bereitgestellten Daten zu Sicherheitslücken bei der Ausführung von Code in Ihrem Code führen kann.
XMLBeans funktioniert hervorragend, wenn Sie ein Schema für Ihr XML haben. Es erstellt Java-Objekte für das Schema und einfach zu verwendende Analysemethoden.
Wenn Sie über die automatische XML-Serialisierung von Objekten sprechen, lesen Sie Castor :
Castor ist ein Open Source-Datenbindungsframework für Java [tm]. Dies ist der kürzeste Weg zwischen Java-Objekten, XML-Dokumenten und relationalen Tabellen. Castor bietet Java-zu-XML-Bindung, Java-zu-SQL-Persistenz und mehr.
Normalerweise verwende ich jaxb oder XMLBeans, wenn ich Objekte erstellen muss, die für XML serialisierbar sind. Jetzt kann ich diesen XStream sehen sehr nützlich sein kann, da es nicht aufdringlich ist und eine wirklich einfache API hat. Ich werde bald damit spielen und es wahrscheinlich benutzen. Der einzige Nachteil, den ich bemerkt habe, ist, dass ich die Objekt-ID nicht selbst für Querverweise erstellen kann.
@ Barak Schiller
Danke, dass du den Link zu XStream gepostet hast!
Vergiss JiBX nicht .
Wenn Sie eine strukturierte Lösung (wie ORM) wünschen, ist JAXB2 eine gute Lösung.
Wenn Sie eine Serialisierung wie DOT NET wünschen, können Sie die Langzeitpersistenz von JavaBeans-Komponenten verwenden
Die Wahl hängt von der Verwendung der Serialisierung ab.
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;
}