Qual è l'analogo Java della serializzazione XML di .NET?
Qual è l'analogo Java della serializzazione XML di .NET?
Risposte:
Risposta 2008 L'API Java "ufficiale" per questo è ora JAXB - API Java per XML Binding. Vedi Tutorial di Oracle . L'implementazione di riferimento è disponibile su http://jaxb.java.net/
Aggiornamento 2018 Si noti che i moduli Java EE e CORBA sono obsoleti in SE in JDK9 e devono essere rimossi da SE in JDK11 . Pertanto, per utilizzare JAXB sarà necessario che sia nell'ambiente di classe enterprise esistente in bundle dal tuo server app, ad esempio, o dovrai importarlo manualmente.
XStream è abbastanza bravo a serializzare oggetti in XML senza molta configurazione e denaro! (è sotto licenza BSD).
L'abbiamo usato in uno dei nostri progetti per sostituire la semplice vecchia serializzazione java e ha funzionato quasi immediatamente.
Potresti voler esaminare il progetto Serializzazione XML semplice . È la cosa più vicina che ho trovato a System.Xml.Serialization in .Net.
JAXB fa parte dell'edizione standard JDK versione 1.6+. Così è FREE
e non ci sono librerie extra da scaricare e gestire. Un semplice esempio può essere trovato qui
XStream sembra essere morto. L'ultimo aggiornamento è stato il 6 dicembre 2008.
Simple
Sembra facile e più semplice come JAXB ma non sono riuscito a trovare alcuna informazione sulla licenza per valutarlo per uso aziendale.
Vale la pena ricordare che dalla versione 1.4, Java aveva le classi java.beans.XMLEncoder e java.beans.XMLDecoder. Queste classi eseguono la codifica XML che è almeno molto paragonabile alla serializzazione XML e in alcune circostanze potrebbe fare il trucco per te.
Se la tua classe si attiene alla specifica JavaBeans per i suoi getter e setter, questo metodo è semplice da usare e non hai bisogno di uno schema. Con i seguenti avvertimenti:
Ad esempio, prendi la seguente dichiarazione:
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;}
}
Esecuzione di questo codice:
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();
Risulterebbe nel seguente file:
<?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
con i dati forniti dall'utente potrebbe introdurre vulnerabilità di esecuzione di codice arbitrario nel codice.
XMLBeans funziona alla grande se hai uno schema per il tuo XML. Crea oggetti Java per lo schema e crea metodi di analisi facili da usare.
Se stai parlando della serializzazione XML automatica degli oggetti, controlla Castor :
Castor è un framework di associazione dati Open Source per Java [tm]. È il percorso più breve tra oggetti Java, documenti XML e tabelle relazionali. Castor fornisce binding Java-to-XML, persistenza Java-to-SQL e altro ancora.
Di solito utilizzo jaxb o XMLBeans se ho bisogno di creare oggetti serializzabili in XML. Ora, posso vedere che XStream potrebbe essere molto utile in quanto non è intrusivo e ha un'API davvero semplice. Ci giocherò presto e probabilmente lo userò. L'unico inconveniente che ho notato è che non posso creare l'ID dell'oggetto da solo per i riferimenti incrociati.
@Barak Schiller
Grazie per aver pubblicato il link a XStream!
se vuoi una soluzione strutturata (come ORM), JAXB2 è una buona soluzione.
Se desideri una serializzazione come DOT NET, puoi utilizzare Long Term Persistence of JavaBeans Components
La scelta dipende dall'uso della serializzazione.
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;
}