Jaki jest odpowiednik serializacji XML w języku Java w języku Java?
Jaki jest odpowiednik serializacji XML w języku Java w języku Java?
Odpowiedzi:
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.
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.
Możesz zajrzeć do projektu Simple XML Serialization . Jest to najbliższa rzecz, jaką znalazłem, do System.Xml.Serialization w .Net.
JAXB jest częścią standardowej edycji JDK w wersji 1.6+. Tak jest FREE
i 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.
Simple
Wydaje się tak łatwa i prostsza jak JAXB, ale nie mogłem znaleźć żadnych informacji licencyjnych, aby ocenić ją do użytku korporacyjnego.
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:
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>
java.beans.XMLDecoder
z danymi dostarczonymi przez użytkownika może wprowadzić luki w zabezpieczeniach umożliwiające wykonanie dowolnego kodu w kodzie.
XMLBeans działa świetnie, jeśli masz schemat dla swojego XML. Tworzy obiekty Java dla schematu i tworzy łatwe w użyciu metody analizy.
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.
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!
jeśli potrzebujesz ustrukturyzowanego rozwiązania (takiego jak ORM), JAXB2 jest dobrym rozwiązaniem.
Jeśli chcesz serializacji, takiej jak DOT NET, możesz użyć długoterminowej trwałości komponentów JavaBeans
Wybór zależy od użycia serializacji.
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;
}