Serializacja XML w Javie? [zamknięte]

Co jest analogiem Javy w serializacji XML. NET?

Author: Raedwald, 2008-08-30

11 answers

2008 odpowiedź "Oficjalnym" API Java dla tego jest teraz JAXB - Java API for XML Binding. Zobacz Tutorial napisany przez Oracle . Implementacja referencyjna żyje na poziomie http://jaxb.java.net/

2018 Update Należy zauważyć, że Moduły Java EE i CORBA są przestarzałe w SE w jdk9 i mają zostać usunięte z Se w JDK11. W związku z tym, aby korzystać z JAXB, musi on znajdować się w istniejącym środowisku klasy korporacyjnej w pakiecie np. z serwerem aplikacji, lub trzeba go przynieść ręcznie.

 76
Author: Cheekysoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 13:10:05

XStream jest całkiem dobry w serializowaniu obiektu do XML bez dużej konfiguracji i pieniędzy! (jest na licencji BSD).

Użyliśmy go w jednym z naszych projektów, aby zastąpić zwykłą starą serializację Javy i zadziałało prawie po wyjęciu z pudełka.

 67
Author: Barak Schiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 12:32:43

Projekt"Simple XML Serialization"

Możesz zajrzeć do projektu Simple XML Serialization . To jest najbliższa rzecz jaką znalazłem do systemu.Xml.Serializacja w .Net.

 16
Author: ARKBAN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 20:29:05

JAXB jest częścią JDK standard edition w wersji 1.6+. Tak więc jest to FREE i nie ma dodatkowych bibliotek do pobrania i zarządzania. Prosty przykład można znaleźć tutaj

XStream wydaje się być martwy. Last update was on Dec 6 2008. Simple wydaje się tak proste i prostsze jak JAXB, ale nie mogłem znaleźć żadnych informacji licencyjnych, aby ocenić go do użytku korporacyjnego.

 13
Author: so_mv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 08:16:19

Warto wspomnieć, że od wersji 1.4 Java posiadała klasy java.fasola.XMLEncoder i java.fasola.XMLDecoder. Klasy te wykonują kodowanie XML, które jest co najmniej bardzo porównywalne do serializacji XML i w niektórych okolicznościach może zrobić sztuczkę za Ciebie.

Jeśli twoja klasa trzyma się specyfikacji JavaBeans dla getterów i setterów, ta metoda jest prosta w użyciu i nie potrzebujesz schematu. Z następującymi zastrzeżeniami:

  • jak w przypadku zwykłej Javy serializacja
    • kodowanie i dekodowanie przebiega przez strumień wejściowy i wyjściowy
    • proces używa metod familar writeobject i readObject
  • w przeciwieństwie do zwykłej serializacji Javy
    • kodowanie, ale także dekodowanie powoduje wywołanie konstruktorów i inicjalizatorów
    • kodowanie i dekodowanie działa niezależnie od tego, czy Twoja klasa implementuje Serializowalny czy nie
    • modyfikatory przejściowe nie są brane pod uwagę
    • działa tylko dla klasy publiczne, które mają konstruktory publiczne

Na przykład, weźmy następującą deklarację:

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

Wykonanie tego kodu:

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();

Wynikałoby z następującego pliku:

<?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>
 8
Author: Mishax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 04:48:15

XMLBeans działa świetnie, jeśli masz schemat dla swojego XML. Tworzy obiekty Java dla schematu i tworzy łatwe w użyciu metody parsowania.

 2
Author: John Meagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 11:39:16

Jeśli mówisz o automatycznej serializacji XML obiektów, sprawdź Castor :

Castor jest Open Source data binding framework dla Java [tm]. Jest to najkrótsza ścieżka pomiędzy obiektami Java, dokumentami XML i tabelami relacyjnymi. Castor zapewnia powiązanie Java-to-XML, trwałość Java-to-SQL i wiele innych.

 0
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 08:49:34

Zwykle używam jaxb lub XMLBeans , jeśli muszę tworzyć obiekty serializowalne do XML. Teraz widzę, że XStream może być bardzo przydatny, ponieważ jest nieinwazyjny i ma naprawdę proste api. Niedługo się nim pobawię i pewnie go użyję. Jedyną wadą, którą zauważyłem, jest to,że nie mogę samodzielnie utworzyć ID obiektu do porównywania.

@Barak Schiller
Dzięki za zamieszczenie linku do XStream!

 0
Author: Bartosz Bierkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-31 11:19:06

Nie zapomnij JiBX .

 0
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-29 17:02:14

Jeśli chcesz rozwiązanie strukturalne (Jak ORM), to jaxb2 jest dobrym rozwiązaniem.

Jeśli chcesz serializacji jak DOT NET, możesz użyć długotrwałej trwałości komponentów JavaBeans

Wybór zależy od zastosowania serializacji.

 0
Author: m.genova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-31 21:48:19
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;
}
 -1
Author: user4067649,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 07:59:52