XStream - Hızlı Kılavuz
XStream, Java nesnelerini XML'e veya tam tersine serileştirmek için Java tabanlı basit bir kitaplıktır.
Özellikleri
Easy to use - XStream API, yaygın kullanım durumlarını basitleştirmek için üst düzey bir cephe sağlar.
No need to create mapping - XStream API, serileştirilecek nesnelerin çoğu için varsayılan eşleme sağlar.
Performance - XStream hızlıdır ve düşük bellek ayak izine sahiptir, bu da büyük nesne grafikleri veya sistemleri için uygundur.
Clean XML - XStream, okunması kolay, temiz ve kompakt XML çıktıları üretir.
Object modification not required- XStream, özel ve son alanlar gibi dahili alanları serileştirir ve genel olmayan ve iç sınıfları destekler. Varsayılan kurucu zorunlu bir gereksinim değildir.
Full object graph support - XStream, nesne modelinde karşılaşılan yinelenen referansların korunmasına izin verir ve ayrıca dairesel referansları destekler.
Customizable conversion strategies - Belirli bir türün özelleştirilmesinin XML olarak temsil edilmesine izin vermek için özel stratejiler kaydedilebilir.
Security framework - XStream, manipüle edilmiş girdilerle güvenlik sorunlarını önlemek için sıralanmamış türler üzerinde adil bir kontrol sağlar.
Error messages - Yanlış biçimlendirilmiş XML nedeniyle bir istisna oluştuğunda, sorunu çözmek için ayrıntılı tanılama sağlar.
Alternative output format - XStream, JSON ve morphing gibi diğer çıktı formatlarını destekler.
Ortak Kullanımlar
Transport - XML, nesnenin bir metin temsilidir ve kullanılan serileştirme / seriyi kaldırma tekniklerinden bağımsız olarak nesneleri kablo üzerinden taşımak için kullanılabilir.
Persistence - Nesneler veritabanlarında XML olarak saklanabilir ve gerektiğinde ve gerektiğinde sıralanabilir / sıralanabilir.
Configuration- XML kendinden açıklamalıdır ve yapılandırmaları tanımlamak için yoğun bir şekilde kullanılır. Nesneler, XML gösterimine dönüştürüldükten sonra konfigürasyon amacıyla da kullanılabilir.
Unit Tests - XStream API, JUnit uyumludur ve uygulama modüllerinin birim testini geliştirmek için kullanılabilir.
Bu bölümde, Java için uygun bir ortam kurmanın farklı yönlerini tartışacağız.
Yerel Ortam Kurulumu
Ortamınızı Java programlama dili için ayarlamak istiyorsanız, bu bölüm Java'yı makinenize nasıl indirip kuracağınızı açıklar. Java ortamınızı kurmak için lütfen aşağıda verilen adımları izleyin.
Java SE, bağlantıdan ücretsiz olarak indirilebilir -
Java'yı indirin .
Java'yı indirmek için talimatları izleyin ve .exeMakinenize Java yüklemek için. Java'yı makinenize yükledikten sonra, ortam değişkenlerini doğru yükleme dizinlerini gösterecek şekilde ayarlamanız gerekir -
Windows 2000 / XP için Yolu Ayarlama
Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -
"Bilgisayarım" ı sağ tıklayın ve "Özellikler" i seçin.
"Gelişmiş" sekmesinin altındaki "Ortam değişkenleri" düğmesini tıklayın.
'Yol' değişkenini, aynı zamanda Java yürütülebilir dosyasının yolunu da içerecek şekilde değiştirin. Örneğin, yol şu anda 'C: \ WINDOWS \ SYSTEM32' olarak ayarlanmışsa, yolunuzu 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin' olarak değiştirin.
Windows 95/98 / ME için Yolu Ayarlama
Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -
'C: \ autoexec.bat' dosyasını düzenleyin ve sonuna aşağıdaki satırı ekleyin -
'YOL AYARLA =% PATH%; C: \ Program Dosyaları \ java \ jdk \ bin'
Linux, UNIX, Solaris, FreeBSD için Yol Ayarlama
PATH ortam değişkeni, Java ikili dosyalarının kurulu olduğu yeri gösterecek şekilde ayarlanmalıdır. Bunu yapmakta sorun yaşıyorsanız, kabuk belgelerinize bakın.
Örneğin, kabuğunuz olarak bash kullanırsanız , '.bashrc: export PATH = / path / to / java: $ PATH'in sonuna aşağıdaki satırı eklersiniz.
Popüler Java Editörleri
Java programları yazmak için bir metin düzenleyiciye ihtiyacınız olacak. Piyasada daha da sofistike IDE'ler mevcuttur. Ancak şimdilik aşağıdakilerden birini düşünebilirsiniz -
Notepad - Windows'ta, Not Defteri (Bu eğitim için önerilir) veya TextPad gibi herhangi bir basit metin düzenleyiciyi kullanabilirsiniz.
Netbeans - Ücretsiz ve indirilebilen bir Java IDE'dir https://www.netbeans.org/index.html.
Eclipse - Eclipse açık kaynak topluluğu tarafından geliştirilmiş bir Java IDE'dir ve şu adresten indirilebilir: https://www.eclipse.org/.
XStream Arşivini İndirin
XStream jar dosyasının en son sürümünü xstream-1.4.7.jar'dan indirin. Bu öğreticiyi yazarken, xstream-1.4.7.jar dosyasını indirdik ve C: \> XStream klasörüne kopyaladık.
işletim sistemi | Arşiv adı |
---|---|
pencereler | xstream-1.4.7.jar |
Linux | xstream-1.4.7.jar |
Mac | xstream-1.4.7.jar |
XStream Ortamını Ayarlayın
Yı kur XStream_HOMExstream jar'ın makinenizde depolandığı temel dizin konumuna işaret etmek için ortam değişkeni. Aşağıdaki tablo, XStream klasöründe xstream-1.4.7.jar dosyasını çıkardığımızı varsayarak XStream ortamının Windows, Linux ve Mac'te nasıl ayarlanacağını gösterir.
Sr.No. | İşletim Sistemi ve Açıklama |
---|---|
1 | Windows XStream_HOME ortam değişkenini C: \ XStream olarak ayarlayın |
2 | Linux dışa aktar XStream_HOME = / usr / local / XStream |
3 | Mac dışa aktar XStream_HOME = / Library / XStream |
CLASSPATH Değişkenini Ayarla
Yı kur CLASSPATHXStream jar konumunu işaret edecek ortam değişkeni. Aşağıdaki tablo, xstream-1.4.7.jar dosyasını XStream klasöründe sakladığımızı varsayarak, CLASSPATH değişkeninin Windows, Linux ve Mac sisteminde nasıl ayarlanacağını gösterir.
Sr.No. | İşletim Sistemi ve Açıklama |
---|---|
1 | Windows Ortam değişkenini CLASSPATH olarak% CLASSPATH%;% XStream_HOME% \ xstream-1.4.7.jar; |
2 | Linux dışa aktar CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
3 | Mac dışa aktar CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
XStream kitaplığının ayrıntılarına girmeden önce, bir uygulamanın işleyişini görelim. Bu örnekte, Öğrenci ve Adres sınıfları oluşturduk. Bir öğrenci nesnesi oluşturacağız ve daha sonra onu bir XML Dizgesine serileştireceğiz. Ardından öğrenci nesnesini geri almak için aynı XML dizesini yeniden serileştirin.
C: \> XStream_WORKSPACE konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
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
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
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
]
]
Hatırlanması Gereken Adımlar
Burada dikkate alınması gereken önemli adımlar aşağıdadır.
1. Adım: XStream Nesnesi Oluşturun
Bir StaxDriver ileterek bir XStream nesnesi oluşturun. StaxDriver, Stax çekme ayrıştırıcısını (java 6'dan temin edilebilir) kullanır ve hızlı bir xml ayrıştırıcısıdır.
XStream xstream = new XStream(new StaxDriver());
Adım 2: Nesneyi XML'e Dizgeleştirin
Nesnenin XML dizesi temsilini almak için toXML () yöntemini kullanın.
//Object to XML Conversion
String xml = xstream.toXML(student);
3. Adım: Nesneyi Almak için XML'in serileştirmesini kaldırın
XML'den nesneyi almak için fromXML () yöntemini kullanın.
//XML to Object Conversion
Student student1 = (Student)xstream.fromXML(xml);
Aliasing, oluşturulan XML'i özelleştirmek veya XStream kullanarak belirli bir biçimlendirilmiş XML kullanmak için bir tekniktir. Student nesnesini serileştirmek / serileştirmek için aşağıdaki XML biçiminin kullanılacağını varsayalım.
<student name = "Suresh">
<note>
<title>first</title>
<description>My first assignment.</description>
</note>
<note>
<title>second</title>
<description>My second assignment.</description>
</note>
</student>
Yukarıdaki XML formatına göre model sınıfları oluşturalım.
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;
}
}
XStream kullanarak yukarıdaki nesnelerin serileştirmesini test edelim.
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
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
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Çıkışı aşağıdaki gibi doğrulayın -
<?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>
Yukarıdaki sonuçta, Öğrenci nesnesi adı tam olarak nitelendirilmiştir. Bunu öğrenci etiketi olarak değiştirmek için sonraki bölümü takip edin.
Sınıf Adlandırma
Alan Adlandırma
Örtülü Koleksiyonlar Diğer Adlandırma
Öznitelik Örtüşme
Paket Adlandırma
XStream, kodlama yerine otomatik konfigürasyona benzer şekilde ek açıklamaları destekler. Önceki bölümde, kodda aşağıdaki konfigürasyonları gördük.
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");
Aşağıdaki kod parçacığı, aynı işi çok daha kolay bir şekilde yapmak için ek açıklamaların kullanımını göstermektedir.
@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;
}
XStream kullanarak yukarıdaki açıklamayı test edelim.
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
Dosya: 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;
}
}
Sonucu Doğrulayın
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Çıkışı aşağıdaki gibi doğrulayın -
<?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>
XStream çerçevesine açıklamayı işleme talimatı vermek için, xml'yi serileştirmeden önce aşağıdaki komutu eklemeniz gerekir.
xstream.processAnnotations(Student.class);
Veya
xstream.autodetectAnnotations(true);
XStream dönüştürücüler, XStream kitaplığının temel bileşenleridir ve bir nesneyi XML'e veya tersi yönde dönüştürmekten sorumludur. XStream, temel öğeler, Dize, Dosya, Koleksiyonlar, diziler ve Tarihler gibi yaygın türler için çok sayıda dönüştürücü sağlar.
Dönüştürücüyü Kullanma
Bir nesneyi tek bir dizeye dönüştürmek olan bir SingleValueConvertor kullanalım. Bir nesneyi öznitelik dizesi olarak yazmak için SingleValueConvertor kullanacağız.
Bir Dönüştürücü Oluşturun
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);
}
}
Bir Dönüştürücü Kaydedin
xstream.registerConverter(new NameConverter());
Dönüştürücüsüz Örnek
İlk önce kodu XStream'de dönüştürücü olmadan test edelim.
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
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
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Çıkışı aşağıdaki gibi doğrulayın -
<?xml version = "1.0" encoding = "UTF-8"?>
<student>
<name>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</name>
</student>
Dönüştürücü ile Örnek
Şimdi kodu dönüştürücü ile XStream'de test edelim.
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
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
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Çıkışı aşağıdaki gibi doğrulayın -
<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh,Parashar"/>
Özel Dönüştürücü
XStream, java.io.ObjectInputStream ve java.io.ObjectOutputStream uygulamalarının alternatif uygulamalarını sağlar, böylece nesnelerin akışları XML'den serileştirilebilir veya serileştirmesi kaldırılabilir. Bu, özellikle büyük nesne kümelerinin işleneceği durumlarda, her seferinde bir nesnenin bellekte tutulması gerektiğinde yararlıdır.
Sözdizimi: createObjectOutputStream ()
ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
new FileOutputStream("test.txt"));
Sözdizimi: createObjectInputStream ()
ObjectInputStream objectInputStream = xstream.createObjectInputStream(
new FileInputStream("test.txt"));
Şimdi kodu XStream'deki nesne akışlarıyla test edelim.
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
Dosya: 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+ " ]";
}
}
Sonucu Doğrulayın
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Çıkışı aşağıdaki gibi doğrulayın -
Student [ firstName: Mahesh, lastName: Parashar ]
Student [ firstName: Suresh, lastName: Kalra ]
Student [ firstName: Ramesh, lastName: Kumar ]
Student [ firstName: Naresh, lastName: Sharma ]
Hello World
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream klasöründe bulunan test.txt içeriğine bakın.
<?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, XStream nesnesini uygun bir sürücü ile başlatarak JSON'u destekler. XStream şu anda JettisonMappedXmlDriver ve JsonHierarchicalStreamDriver'ı desteklemektedir.
Şimdi kodu XStream'de json işleme ile test edelim.
C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream konumunda XStreamTester adlı bir java sınıf dosyası oluşturun.
Dosya: 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+ " ]";
}
}
Sonucu Doğrulayın
Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Şimdi sonucu görmek için XStreamTester'ı çalıştırın -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Çıkışı aşağıdaki gibi doğrulayın -
{
"firstName": "Mahesh",
"lastName": "Parashar"
}