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"
}