Serializzazione XML in Java? [chiuso]


104

Qual è l'analogo Java della serializzazione XML di .NET?


6
Ah, i gloriosi vecchi tempi in cui domande di una riga come questa erano benvenute su SO. Così utile. Senza tutte quelle sciocchezze "Cosa hai provato?" / "Fornisci dettagli" oggi le persone amano leggere.
GOTO 0

Risposte:


81

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.


2
Esatto, JAXB è sicuramente l'opzione migliore!
ivan_ivanovich_ivanoff

1
JAXB è stato rimosso dalle distribuzioni java standard a partire da Java 10, il che lo rende ora una libreria che devi abbinare alla tua applicazione se lo desideri, a meno che tu non stia operando in un contesto che già lo raggruppa per te.
Theodore Murdock

69

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.


3
Molto utile, può avere problemi su strutture ad albero complecate come Jgraph con oggetti nodo non stringa.
mikek3332002

Più

Mi piace XStream. L'unica cosa è che non capisco perché un carattere viene aggiunto prima dell'XML effettivo.
James P.

17

Progetto "Serializzazione XML semplice"

Potresti voler esaminare il progetto Serializzazione XML semplice . È la cosa più vicina che ho trovato a System.Xml.Serialization in .Net.


Tuttavia, richiede annotazioni di mappatura per ogni campo.
mP.

1
Non è vero, non ho bisogno. È possibile modificare il comportamento predefinito e utilizzerà solo i campi presenti.
damluar

1
Approvo vivamente anche "Simple" . L'ho usato su un paio di progetti con grande successo. "Semplice" è davvero molto più semplice di JAXB. Più appropriato quando hai esigenze relativamente semplici: hai oggetti che devono essere scritti nella memoria per essere successivamente reidratati come oggetti. JAXB ha molte più funzionalità e flessibilità, ma è un tipo "80/20", la maggior parte delle volte nella maggior parte dei progetti potrebbe essere necessario solo il semplice sottoinsieme di funzionalità.
Basil Bourque

Funziona bene se vuoi solo una mappatura 1: 1. Se le tue classi si evolvono e hai ancora bisogno di deserializzare il vecchio XML, incappi in problemi perché sia ​​la documentazione che i messaggi di errore sono piuttosto vaghi. La diagnosi del problema è solitamente fattibile, ma capire come risolverlo potrebbe richiedere diversi giorni.
toolforger

13

JAXB fa parte dell'edizione standard JDK versione 1.6+. Così è FREEe 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. SimpleSembra facile e più semplice come JAXB ma non sono riuscito a trovare alcuna informazione sulla licenza per valutarlo per uso aziendale.


4
XStream non è morto, è solo maturo e stabile, il che significa che non c'è molto da aggiungere alle funzionalità di base. Lo stesso vale in realtà per l'implementazione di riferimento JAXB, non molta attività negli ultimi due anni.
StaxMan

9

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:

  • Come con la normale serializzazione Java
    • la codifica e la decodifica vengono eseguite su InputStream e OutputStream
    • il processo utilizza i comuni metodi writeObject e readObject
  • In contrasto con la normale serializzazione Java
    • la codifica, ma anche la decodifica, fa invocare 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, 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>

Tenere presente che l'utilizzo java.beans.XMLDecodercon i dati forniti dall'utente potrebbe introdurre vulnerabilità di esecuzione di codice arbitrario nel codice.
avventurina

2

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.


0

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.


0

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!


Il problema è che jaxb e xmlbeans richiedono uno schema di mappatura e arent auto ...
mP.



-1
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;
}

Molti problemi: Reinvenzione della classe # getSimpleName *** Reinvenzione di PropertyDescriptor *** Presume che tutte le proprietà siano campi accessibili *** Non memorizza nella cache i risultati della riflessione (slooow) *** Nessun modo per personalizzare nulla (ad esempio, dovrei sostituire classe e nomi di file) *** Nessuna deserializzazione
toolforger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.