XStream - szybki przewodnik
XStream to prosta biblioteka oparta na Javie do serializacji obiektów Java do XML i odwrotnie.
funkcje
Easy to use - XStream API zapewnia elewację wysokiego poziomu w celu uproszczenia typowych przypadków użycia.
No need to create mapping - XStream API zapewnia domyślne mapowanie dla większości obiektów przeznaczonych do serializacji.
Performance - XStream jest szybki i zajmuje mało pamięci, co jest odpowiednie dla dużych grafów obiektów lub systemów.
Clean XML - XStream generuje czyste i kompaktowe wyjście XML, które jest łatwe do odczytania.
Object modification not required- XStream serializuje pola wewnętrzne, takie jak pola prywatne i końcowe, oraz obsługuje klasy niepubliczne i wewnętrzne. Konstruktor domyślny nie jest wymaganiem obowiązkowym.
Full object graph support - XStream pozwala zachować zduplikowane odniesienia napotkane w modelu obiektowym, a także obsługuje odwołania cykliczne.
Customizable conversion strategies - Można zarejestrować strategie niestandardowe, aby umożliwić dostosowanie określonego typu do reprezentacji w postaci XML.
Security framework - XStream zapewnia uczciwą kontrolę nad typami nieskorygowanymi, aby zapobiec problemom z bezpieczeństwem związanym z manipulowanymi danymi wejściowymi.
Error messages - Gdy wystąpi wyjątek z powodu nieprawidłowego formatu XML, zapewnia szczegółową diagnostykę w celu rozwiązania problemu.
Alternative output format - XStream obsługuje inne formaty wyjściowe, takie jak JSON i morfing.
Typowe zastosowania
Transport - XML jest tekstową reprezentacją obiektu i może być używany do transportu obiektów przez sieć niezależnie od użytych technik serializacji / deserializacji.
Persistence - Obiekty mogą być utrwalane jako XML w bazach danych i mogą być kierowane / unmarshalled w razie potrzeby.
Configuration- XML nie wymaga wyjaśnień i jest często używany do definiowania konfiguracji. Obiekty mogą być również używane do celów konfiguracyjnych po przekonwertowaniu ich na reprezentację XML.
Unit Tests - XStream API jest kompatybilny z JUnit i może być używany do ulepszania testów jednostkowych modułów aplikacji.
W tym rozdziale omówimy różne aspekty konfigurowania odpowiedniego środowiska dla języka Java.
Konfiguracja środowiska lokalnego
Jeśli chcesz skonfigurować środowisko dla języka programowania Java, w tej sekcji wyjaśniono, jak pobrać i skonfigurować Java na swoim komputerze. Wykonaj poniższe czynności, aby skonfigurować środowisko Java.
Java SE można pobrać bezpłatnie z linku -
Pobierz Javę .
Postępuj zgodnie z instrukcjami, aby pobrać Javę i uruchomić .exeaby zainstalować Javę na swoim komputerze. Po zainstalowaniu Javy na komputerze należałoby ustawić zmienne środowiskowe, aby wskazywały prawidłowe katalogi instalacyjne -
Konfigurowanie ścieżki dla Windows 2000 / XP
Zakładając, że zainstalowałeś Javę w katalogu c: \ Program Files \ java \ jdk -
Kliknij prawym przyciskiem myszy „Mój komputer” i wybierz „Właściwości”.
Kliknij przycisk „Zmienne środowiskowe” na karcie „Zaawansowane”.
Zmień zmienną „Path”, tak aby zawierała również ścieżkę do pliku wykonywalnego Java. Na przykład, jeśli ścieżka jest obecnie ustawiona na „C: \ WINDOWS \ SYSTEM32”, zmień ścieżkę na „C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin”.
Konfiguracja ścieżki dla Windows 95/98 / ME
Zakładając, że zainstalowałeś Javę w katalogu c: \ Program Files \ java \ jdk -
Edytuj plik „C: \ autoexec.bat” i dodaj następujący wiersz na końcu -
'SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin'
Konfigurowanie ścieżki dla systemów Linux, UNIX, Solaris, FreeBSD
Zmienna środowiskowa PATH powinna być ustawiona tak, aby wskazywała, gdzie zostały zainstalowane pliki binarne Java. Zajrzyj do dokumentacji powłoki, jeśli masz z tym problem.
Na przykład, jeśli używasz bash jako powłoki, możesz dodać następujący wiersz na końcu swojego '.bashrc: export PATH = / path / to / java: $ PATH'
Popularne edytory Java
Do pisania programów w języku Java potrzebny będzie edytor tekstu. Na rynku dostępne są jeszcze bardziej wyrafinowane środowiska IDE. Ale na razie możesz rozważyć jedną z następujących rzeczy -
Notepad - W systemie Windows możesz użyć dowolnego prostego edytora tekstu, takiego jak Notatnik (zalecany w tym samouczku) lub TextPad.
Netbeans - Jest to środowisko Java IDE, które jest bezpłatne i można je pobrać z https://www.netbeans.org/index.html.
Eclipse - Jest to również środowisko Java IDE opracowane przez społeczność open-source eclipse i można je pobrać z witryny https://www.eclipse.org/.
Pobierz archiwum XStream
Pobierz najnowszą wersję pliku jar XStream z xstream-1.4.7.jar. W momencie pisania tego samouczka pobraliśmy xstream-1.4.7.jar i skopiowaliśmy go do folderu C: \> XStream.
OS | Nazwa archiwum |
---|---|
Windows | xstream-1.4.7.jar |
Linux | xstream-1.4.7.jar |
Prochowiec | xstream-1.4.7.jar |
Ustaw środowisko XStream
Ustaw XStream_HOMEzmienna środowiskowa, aby wskazywała lokalizację katalogu podstawowego, w którym znajduje się plik jar xstream na komputerze. Poniższa tabela pokazuje, jak ustawić środowisko XStream w systemach Windows, Linux i Mac, zakładając, że wyodrębniliśmy xstream-1.4.7.jar w folderze XStream.
Sr.No. | System operacyjny i opis |
---|---|
1 | Windows Ustaw zmienną środowiskową XStream_HOME na C: \ XStream |
2 | Linux eksportuj XStream_HOME = / usr / local / XStream |
3 | Mac eksportuj XStream_HOME = / Library / XStream |
Ustaw zmienną CLASSPATH
Ustaw CLASSPATHzmienna środowiskowa wskazująca lokalizację jar XStream. Poniższa tabela pokazuje, jak ustawić zmienną CLASSPATH w systemie Windows, Linux i Mac, zakładając, że przechowujemy xstream-1.4.7.jar w folderze XStream.
Sr.No. | System operacyjny i opis |
---|---|
1 | Windows Ustaw zmienną środowiskową CLASSPATH na% CLASSPATH%;% XStream_HOME% \ xstream-1.4.7.jar; |
2 | Linux eksportuj CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
3 | Mac eksportuj CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
Zanim przejdziemy do szczegółów biblioteki XStream, zobaczmy, jak działa aplikacja. W tym przykładzie utworzyliśmy klasy Student i Address. Utworzymy obiekt studenta, a następnie serializujemy go do ciągu XML. Następnie zdeserializuj ten sam ciąg XML, aby odzyskać obiekt studenta.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE.
File: XStreamTester.java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
//XML to Object Conversion
Student student1 = (Student)xstream.fromXML(xml);
System.out.println(student1);
}
private Student getStudentDetails() {
Student student = new Student();
student.setFirstName("Mahesh");
student.setLastName("Parashar");
student.setRollNo(1);
student.setClassName("1st");
Address address = new Address();
address.setArea("H.No. 16/3, Preet Vihar.");
address.setCity("Delhi");
address.setState("Delhi");
address.setCountry("India");
address.setPincode(110012);
student.setAddress(address);
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
class Student {
private int rollNo;
private String firstName;
private String lastName;
private String className;
private Address address;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Student [ ");
stringBuilder.append("\nfirstName: ");
stringBuilder.append(firstName);
stringBuilder.append("\nlastName: ");
stringBuilder.append(lastName);
stringBuilder.append("\nrollNo: ");
stringBuilder.append(rollNo);
stringBuilder.append("\nclassName: ");
stringBuilder.append(className);
stringBuilder.append("\naddress: ");
stringBuilder.append(address);
stringBuilder.append(" ]");
return stringBuilder.toString();
}
}
class Address {
private String area;
private String city;
private String state;
private String country;
private int pincode;
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public int getPincode() {
return pincode;
}
public void setPincode(int pincode) {
this.pincode = pincode;
}
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("\nAddress [ ");
stringBuilder.append("\narea: ");
stringBuilder.append(area);
stringBuilder.append("\ncity: ");
stringBuilder.append(city);
stringBuilder.append("\nstate: ");
stringBuilder.append(state);
stringBuilder.append("\ncountry: ");
stringBuilder.append(country);
stringBuilder.append("\npincode: ");
stringBuilder.append(pincode);
stringBuilder.append(" ]");
return stringBuilder.toString();
}
}
Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE>java XStreamTester
Verify the output as follows
<?xml version = "1.0" encoding = "UTF-8"?>
<Student>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
<rollNo>1</rollNo>
<className>1st</className>
<address>
<area>H.No. 16/3, Preet Vihar.</area>
<city>Delhi</city>
<state>Delhi</state>
<country>India</country>
<pincode>110012</pincode>
</address>
</Student>
Student [
firstName: Mahesh
lastName: Parashar
rollNo: 1
className: 1st
address:
Address [
area: H.No. 16/3, Preet Vihar.
city: Delhi
state: Delhi
country: India
pincode: 110012
]
]
Kroki do zapamiętania
Poniżej przedstawiono ważne kroki, które należy tutaj rozważyć.
Krok 1: Utwórz obiekt XStream
Utwórz obiekt XStream, przekazując mu StaxDriver. StaxDriver używa parsera ściągania Stax (dostępnego w java 6) i jest szybkim parserem xml.
XStream xstream = new XStream(new StaxDriver());
Krok 2: Serializacja obiektu do XML
Użyj metody toXML (), aby uzyskać reprezentację ciągu XML obiektu.
//Object to XML Conversion
String xml = xstream.toXML(student);
Krok 3: De-serialize XML, aby uzyskać obiekt
Użyj metody fromXML (), aby pobrać obiekt z XML.
//XML to Object Conversion
Student student1 = (Student)xstream.fromXML(xml);
Aliasowanie to technika dostosowywania wygenerowanego XML lub używania określonego sformatowanego XML za pomocą XStream. Załóżmy, że do serializacji / deserializacji obiektu ucznia ma zostać użyty następujący format XML.
<student name = "Suresh">
<note>
<title>first</title>
<description>My first assignment.</description>
</note>
<note>
<title>second</title>
<description>My second assignment.</description>
</note>
</student>
W oparciu o powyższy format XML stwórzmy klasy modeli.
class Student {
private String studentName;
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName() {
return studentName;
}
public List<Note> getNotes() {
return notes;
}
}
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
Przetestujmy powyższą serializację obiektów za pomocą XStream.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
File: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh");
student.addNote(new Note("first","My first assignment."));
student.addNote(new Note("second","My Second assignment."));
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
class Student {
private String studentName;
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName() {
return studentName;
}
public List<Note> getNotes() {
return notes;
}
}
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Sprawdź dane wyjściowe w następujący sposób -
<?xml version = "1.0" encoding = "UTF-8"?>
<com.tutorialspoint.xstream.Student>
<studentName>Mahesh</studentName>
<notes>
<com.tutorialspoint.xstream.Note>
<title>first</title>
<description>My first assignment.</description>
</com.tutorialspoint.xstream.Note>
<com.tutorialspoint.xstream.Note>
<title>second</title>
<description>My Second assignment.</description>
</com.tutorialspoint.xstream.Note>
</notes>
</com.tutorialspoint.xstream.Student>
W powyższym wyniku nazwa obiektu Studenta jest w pełni kwalifikowana. Aby zastąpić go jako tag ucznia, przejdź do następnej sekcji.
Aliasing klas
Aliasing pól
Aliasing kolekcji niejawnych
Aliasing atrybutów
Aliasing pakietów
XStream obsługuje adnotacje podobnie jak automatyczna konfiguracja zamiast kodowania. W poprzednim rozdziale widzieliśmy w kodzie następujące konfiguracje.
xstream.alias("student", Student.class);
xstream.alias("note", Note.class);
xstream.useAttributeFor(Student.class, "studentName");
xstream.aliasField("name", Student.class, "studentName");
xstream.addImplicitCollection(Student.class, "notes");
Poniższy fragment kodu ilustruje użycie adnotacji do wykonania tej samej pracy w znacznie łatwiejszy sposób.
@XStreamAlias("student") //define class level alias
class Student {
@XStreamAlias("name") //define field level alias
@XStreamAsAttribute //define field as attribute
private String studentName;
@XStreamImplicit //define list as an implicit collection
private List<Note> notes = new ArrayList<Note>();
@XStreamOmitField //omit a field to not to be a part of XML
private int type;
}
Przetestujmy powyższą adnotację za pomocą XStream.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Plik: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.processAnnotations(Student.class);
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh");
student.addNote(new Note("first","My first assignment."));
student.addNote(new Note("second","My Second assignment."));
student.setType(1);
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private String studentName;
@XStreamImplicit
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName() {
return studentName;
}
public List<Note> getNotes() {
return notes;
}
@XStreamOmitField
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
@XStreamAlias("note")
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
Sprawdź wynik
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Sprawdź dane wyjściowe w następujący sposób -
<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh">
<note>
<title>first</title>
<description>My first assignment.</description>
</note>
<note>
<title>second</title>
<description>My Second assignment.</description>
</note>
</student>
Aby poinstruować platformę XStream, aby przetwarzała adnotacje, musisz dodać następujące polecenie przed serializacją xml.
xstream.processAnnotations(Student.class);
Lub
xstream.autodetectAnnotations(true);
Konwertery XStream są kluczowymi komponentami biblioteki XStream, które są odpowiedzialne za konwersję obiektu do XML i odwrotnie. XStream zapewnia liczne konwertery dla popularnych typów, takich jak prymitywy, ciągi, pliki, kolekcje, tablice i daty.
Korzystanie z konwertera
Użyjmy SingleValueConvertor, którego celem jest konwersja obiektu na pojedynczy ciąg. Użyjemy SingleValueConvertor do napisania obiektu jako ciągu atrybutu.
Utwórz konwerter
class NameConverter implements SingleValueConverter {
public Object fromString(String name) {
String[] nameparts = name.split(",");
return new Name(nameparts[0], nameparts[1]);
}
public String toString(Object name) {
return ((Name)name).getFirstName() + "," + ((Name)name).getLastName();
}
public boolean canConvert(Class type) {
return type.equals(Name.class);
}
}
Zarejestruj konwerter
xstream.registerConverter(new NameConverter());
Przykład bez konwertera
Najpierw przetestujmy kod bez konwertera w XStream.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
File: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.autodetectAnnotations(true);
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh","Parashar");
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private Name studentName;
public Student(String firstName, String lastName) {
this.studentName = new Name(firstName, lastName);
}
public Name getName() {
return studentName;
}
}
class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Sprawdź dane wyjściowe w następujący sposób -
<?xml version = "1.0" encoding = "UTF-8"?>
<student>
<name>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</name>
</student>
Przykład z konwerterem
Przetestujmy teraz kod za pomocą konwertera w XStream.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
File: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.converters.SingleValueConverter;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.autodetectAnnotations(true);
xstream.registerConverter(new NameConverter());
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh","Parashar");
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private Name studentName;
public Student(String firstName, String lastName) {
this.studentName = new Name(firstName, lastName);
}
public Name getName() {
return studentName;
}
}
class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
class NameConverter implements SingleValueConverter {
public Object fromString(String name) {
String[] nameparts = name.split(",");
return new Name(nameparts[0], nameparts[1]);
}
public String toString(Object name) {
return ((Name)name).getFirstName() + "," + ((Name)name).getLastName();
}
public boolean canConvert(Class type) {
return type.equals(Name.class);
}
}
Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Sprawdź dane wyjściowe w następujący sposób -
<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh,Parashar"/>
Konwerter niestandardowy
XStream zapewnia alternatywne implementacje java.io.ObjectInputStream i java.io.ObjectOutputStream, dzięki czemu strumienie obiektów mogą być serializowane lub deserializowane z XML. Jest to szczególnie przydatne, gdy przetwarzane są duże zestawy obiektów, jednocześnie przechowując jeden obiekt w pamięci.
Składnia: createObjectOutputStream ()
ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
new FileOutputStream("test.txt"));
Składnia: createObjectInputStream ()
ObjectInputStream objectInputStream = xstream.createObjectInputStream(
new FileInputStream("test.txt"));
Przetestujmy teraz kod za pomocą strumieni obiektów w XStream.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Plik: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
xstream.autodetectAnnotations(true);
Student student1 = new Student("Mahesh","Parashar");
Student student2 = new Student("Suresh","Kalra");
Student student3 = new Student("Ramesh","Kumar");
Student student4 = new Student("Naresh","Sharma");
try {
ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
new FileOutputStream("test.txt"));
objectOutputStream.writeObject(student1);
objectOutputStream.writeObject(student2);
objectOutputStream.writeObject(student3);
objectOutputStream.writeObject(student4);
objectOutputStream.writeObject("Hello World");
objectOutputStream.close();
ObjectInputStream objectInputStream = xstream.createObjectInputStream(
new FileInputStream("test.txt"));
Student student5 = (Student)objectInputStream.readObject();
Student student6 = (Student)objectInputStream.readObject();
Student student7 = (Student)objectInputStream.readObject();
Student student8 = (Student)objectInputStream.readObject();
String text = (String)objectInputStream.readObject();
System.out.println(student5);
System.out.println(student6);
System.out.println(student7);
System.out.println(student8);
System.out.println(text);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@XStreamAlias("student")
class Student {
private String firstName;
private String lastName;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String toString() {
return "Student [ firstName: "+firstName+", lastName: "+ lastName+ " ]";
}
}
Sprawdź wynik
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Sprawdź dane wyjściowe w następujący sposób -
Student [ firstName: Mahesh, lastName: Parashar ]
Student [ firstName: Suresh, lastName: Kalra ]
Student [ firstName: Ramesh, lastName: Kumar ]
Student [ firstName: Naresh, lastName: Sharma ]
Hello World
Obejrzyj zawartość pliku test.txt znajdującego się w folderze C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
<?xml version = "1.0" ?>
<object-stream>
<student>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</student>
<student>
<firstName>Suresh</firstName>
<lastName>Kalra</lastName>
</student>
<student>
<firstName>Ramesh</firstName>
<lastName>Kumar</lastName>
</student>
<student>
<firstName>Naresh</firstName>
<lastName>Sharma</lastName>
</student>
<string>Hello World</string>
</object-stream>
XStream obsługuje JSON poprzez inicjalizację obiektu XStream za pomocą odpowiedniego sterownika. XStream obsługuje obecnie JettisonMappedXmlDriver i JsonHierarchicalStreamDriver.
Przetestujmy teraz kod z obsługą json w XStream.
Utwórz plik klasy java o nazwie XStreamTester w C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Plik: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.Writer;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
Student student = new Student("Mahesh","Parashar");
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("student", Student.class);
System.out.println(xstream.toXML(student));
}
}
@XStreamAlias("student")
class Student {
private String firstName;
private String lastName;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String toString() {
return "Student [ firstName: "+firstName+", lastName: "+ lastName+ " ]";
}
}
Sprawdź wynik
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Teraz uruchom XStreamTester, aby zobaczyć wynik -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Sprawdź dane wyjściowe w następujący sposób -
{
"firstName": "Mahesh",
"lastName": "Parashar"
}