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.