Domanda

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

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top