Serializacja XML w Javie? [Zamknięte]


104

Jaki jest odpowiednik serializacji XML w języku Java w języku Java?


7
Ach, wspaniałe stare czasy, kiedy tak jedno liniowe pytania, jak to, były mile widziane w SO. Tak przydatne. Bez tego „Czego próbowałeś?” / „Podaj szczegóły”, ludzie lubią dziś czytać.
GOTO 0

Odpowiedzi:


81

Odpowiedź 2008 "Oficjalnym" Java API do tego jest teraz JAXB - Java API for XML Binding. Zobacz samouczek firmy Oracle . Implementacja referencyjna znajduje się pod adresem http://jaxb.java.net/

Aktualizacja 2018 Należy zauważyć, że moduły Java EE i CORBA są przestarzałe w wersji SE w JDK9 i mają zostać usunięte z SE w JDK11 . W związku z tym, aby używać JAXB, będzie musiał albo znajdować się w istniejącym środowisku klasy korporacyjnej, dołączonym np. Przez serwer aplikacji, albo będzie trzeba wprowadzić go ręcznie.


2
Zgadza się, JAXB to zdecydowanie najlepsza opcja!
ivan_ivanovich_ivanoff

1
JAXB został usunięty ze standardowych dystrybucji Java w wersji Java 10, co sprawia, że ​​jest teraz biblioteką, którą musisz spakować z aplikacją, jeśli chcesz, chyba że działasz w kontekście, który już ją dla Ciebie pakuje.
Theodore Murdock

69

XStream całkiem nieźle radzi sobie z serializacją 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ę Java i działał prawie po wyjęciu z pudełka.


3
Bardzo przydatne, ale może mieć problemy ze skomplikowanymi strukturami drzewiastymi, takimi jak JGraph z obiektami węzłów niebędących łańcuchami.
mikek3332002

Prostsze i lepsze niż inne rozwiązania
daitangio

Lubię XStream. Jedyną rzeczą jest to, że nie rozumiem, dlaczego znak jest dodawany przed właściwym XML.
James P.

17

Projekt „Prosta serializacja XML”

Możesz zajrzeć do projektu Simple XML Serialization . Jest to najbliższa rzecz, jaką znalazłem, do System.Xml.Serialization w .Net.


Wymaga to jednak mapowania adnotacji dla każdego pola.
mP.

1
Nieprawda, nie potrzebuję. Możesz zmienić domyślne zachowanie i użyje tylko obecnych pól.
damluar

1
Gorąco polecam również „Simple” . Użyłem go w kilku projektach z wielkim sukcesem. „Prosty” jest rzeczywiście znacznie prostszy niż JAXB. Najbardziej odpowiednie, gdy masz stosunkowo proste potrzeby: masz obiekty, które muszą zostać zapisane w pamięci, aby później zostały ponownie nawodnione jako obiekty. JAXB ma znacznie więcej funkcji i elastyczności, ale jest to coś w rodzaju „80/20”, przez większość czasu w większości projektów możesz potrzebować tylko prostego podzbioru funkcji.
Basil Bourque

Działa dobrze, jeśli potrzebujesz tylko mapowania 1: 1. Jeśli Twoje klasy ewoluują i nadal musisz deserializować stary plik XML, napotkasz problemy, ponieważ zarówno dokumentacja, jak i komunikaty o błędach są nieco niejasne. Zdiagnozowanie problemu jest zwykle wykonalne, ale ustalenie, jak go naprawić, może zająć kilka dni.
toolforger

13

JAXB jest częścią standardowej edycji JDK w wersji 1.6+. Tak jest FREEi nie ma żadnych dodatkowych bibliotek do pobrania i zarządzania. Prosty przykład można znaleźć tutaj

Wydaje się, że XStream nie żyje. Ostatnia aktualizacja miała miejsce 6 grudnia 2008 r. SimpleWydaje się tak łatwa i prostsza jak JAXB, ale nie mogłem znaleźć żadnych informacji licencyjnych, aby ocenić ją do użytku korporacyjnego.


4
XStream nie jest martwy, jest po prostu dojrzały i stabilny - co oznacza, że ​​nie ma wiele do dodania do podstawowej funkcjonalności. To samo dotyczy implementacji referencyjnej JAXB, niewiele aktywności przez ostatnie kilka lat.
StaxMan

9

Warto wspomnieć, że od wersji 1.4 Java posiadała klasy java.beans.XMLEncoder i java.beans.XMLDecoder. Te klasy wykonują kodowanie XML, które jest co najmniej bardzo porównywalne z serializacją XML iw pewnych okolicznościach może załatwić sprawę.

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

  • Jak w przypadku normalnej serializacji Java
    • kodowanie i dekodowanie odbywa się za pośrednictwem InputStream i OutputStream
    • proces wykorzystuje znane metody writeObject i readObject
  • W przeciwieństwie do normalnej serializacji Java
    • kodowanie, ale także dekodowanie powoduje wywołanie konstruktorów i inicjatorów
    • kodowanie i dekodowanie działa niezależnie od tego, czy klasa implementuje Serializable, czy nie
    • przejściowe modyfikatory nie są brane pod uwagę
    • działa tylko dla klas publicznych, które mają konstruktory publiczne

Na przykład weź 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;}
}

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

Dałoby to następujący plik:

<?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>

Należy pamiętać, że używanie java.beans.XMLDecoderz danymi dostarczonymi przez użytkownika może wprowadzić luki w zabezpieczeniach umożliwiające wykonanie dowolnego kodu w kodzie.
awenturyn

2

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


0

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

Castor to platforma do wiązania danych typu Open Source dla języka Java [tm]. To najkrótsza ścieżka między obiektami Java, dokumentami XML i tabelami relacyjnymi. Castor zapewnia powiązanie Java-XML, trwałość Java-SQL i wiele więcej.


0

Zwykle używam jaxb lub XMLBeans, jeśli potrzebuję utworzyć obiekty serializowalne do XML. Teraz widzę, że XStream może być bardzo przydatny, ponieważ jest nienachalny i ma naprawdę prosty interfejs API. Niedługo się nim pobawię i pewnie go wykorzystam. Jedyną wadą, jaką zauważyłem, jest to, że nie mogę samodzielnie utworzyć identyfikatora obiektu do tworzenia odwołań.

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


Problem polega na tym, że jaxb i xmlbeans wymagają schematu mapowania i nie są automatycznie ...
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;
}

Wiele problemów: Ponowne wynalezienie klasy # getSimpleName *** Ponowne opracowanie PropertyDescriptor *** Zakłada, że ​​wszystkie właściwości są dostępnymi polami *** Nie buforuje wyników odbicia (powolne) *** Nie ma możliwości dostosowania czegokolwiek (np. Musiałbym wymienić nazwy klas i plików) *** Brak deserializacji
toolforger
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.