Serializzazione XML in Java?[Chiuso]
-
09-06-2019 - |
Domanda
Qual è l'analogo Java della serializzazione XML di .NET?
Soluzione
Risposta del 2008L'API Java "ufficiale" per questo è ora JAXB - Java API for XML Binding.Vedere Tutorial di Oracle.L'implementazione di riferimento vive a http://jaxb.java.net/
Aggiornamento 2018 Notare che i moduli Java EE e CORBA sono deprecati in SE in JDK9 e verranno rimossi da SE in JDK11.Pertanto, per utilizzare JAXB sarà necessario trovarlo nel tuo ambiente di classe aziendale esistente raggruppato ad es.app server oppure dovrai inserirlo manualmente.
Altri suggerimenti
XStream è piuttosto bravo a serializzare oggetti in XML senza molta configurazione e denaro!(è sotto licenza BSD).
L'abbiamo utilizzato in uno dei nostri progetti per sostituire la vecchia serializzazione Java e ha funzionato quasi immediatamente.
Progetto "Serializzazione XML semplice".
Potresti voler dare un'occhiata a Serializzazione XML semplice progetto.È la cosa più vicina che ho trovato al System.Xml.Serialization in .Net.
JAXB fa parte dell'edizione standard JDK versione 1.6+.Così è FREE
e nessuna libreria aggiuntiva da scaricare e gestire.Si può trovare un semplice esempio Qui
XStream sembra essere morto.L'ultimo aggiornamento risale al 6 dicembre 2008.Simple
sembra facile e 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 al caso tuo.
Se la tua classe si attiene alle specifiche JavaBeans per i suoi getter e setter, questo metodo è semplice da usare e non hai bisogno di uno schema.Con le seguenti avvertenze:
- Come con la normale serializzazione Java
- la codifica e la decodifica vengono eseguite su InputStream e OutputStream
- il processo utilizza i familiari metodi writeObject e readObject
- A differenza della normale serializzazione Java
- la codifica ma anche la decodifica provocano il richiamo di costruttori e inizializzatori
- la codifica e la decodifica funzionano indipendentemente dal fatto che la tua classe implementi Serializable o meno
- i modificatori transitori non vengono presi in considerazione
- funziona solo per le classi pubbliche, che hanno costruttori pubblici
Ad esempio, prendiamo 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;}
}
Eseguendo 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();
Il risultato sarebbe il 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>
XMLBeans funziona alla grande se hai uno schema per il tuo XML.Crea oggetti Java per lo schema e metodi di analisi facili da usare.
Se stai parlando della serializzazione XML automatica degli oggetti, dai un'occhiata Castore:
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 associazione Java-XML, persistenza Java-SQL e altro ancora.
Di solito uso jaxb O XMLBeans se ho bisogno di creare oggetti serializzabili in XML.Ora posso vederlo XStream potrebbe essere molto utile in quanto non è invadente e ha un'API davvero semplice.Ci giocherò presto e probabilmente lo userò.L'unico inconveniente che ho notato è che non posso creare da solo l'ID dell'oggetto per i riferimenti incrociati.
@Barak Schiller
Grazie per aver pubblicato il collegamento a XStream!
Non dimenticare JiBX.
se vuoi un soluzione strutturata (come ORM), allora JAXB2 è una buona soluzione.
Se desideri una serializzazione come DOT NET, potresti utilizzare Persistenza a lungo termine dei componenti JavaBeans
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;
}