XStream - คู่มือฉบับย่อ
XStream เป็นไลบรารีที่ใช้ Java อย่างง่ายเพื่อทำให้ออบเจ็กต์ Java เป็นอนุกรมเป็น XML และในทางกลับกัน
คุณสมบัติ
Easy to use - XStream API มีส่วนหน้าระดับสูงเพื่อลดความซับซ้อนของกรณีการใช้งานทั่วไป
No need to create mapping - XStream API จัดทำแผนที่เริ่มต้นสำหรับวัตถุส่วนใหญ่ที่จะทำให้เป็นอนุกรม
Performance - XStream นั้นเร็วและมีหน่วยความจำต่ำซึ่งเหมาะสำหรับกราฟหรือระบบวัตถุขนาดใหญ่
Clean XML - XStream สร้างเอาต์พุต XML ที่สะอาดและกะทัดรัดซึ่งอ่านง่าย
Object modification not required- XStream ทำให้ฟิลด์ภายในเป็นอนุกรมเช่นฟิลด์ส่วนตัวและฟิลด์สุดท้ายและรองรับคลาสที่ไม่ใช่สาธารณะและคลาสภายใน ตัวสร้างเริ่มต้นไม่ใช่ข้อกำหนดบังคับ
Full object graph support - XStream อนุญาตให้รักษาการอ้างอิงซ้ำที่พบในโมเดลอ็อบเจ็กต์และยังรองรับการอ้างอิงแบบวงกลม
Customizable conversion strategies - สามารถลงทะเบียนกลยุทธ์ที่กำหนดเองเพื่อให้สามารถกำหนดประเภทเฉพาะที่จะแสดงเป็น XML ได้
Security framework - XStream ให้การควบคุมที่เป็นธรรมสำหรับประเภทที่ไม่มีการสั่นสะเทือนเพื่อป้องกันปัญหาด้านความปลอดภัยด้วยอินพุตที่มีการจัดการ
Error messages - เมื่อเกิดข้อยกเว้นเนื่องจาก XML ผิดรูปแบบจะมีการวินิจฉัยโดยละเอียดเพื่อแก้ไขปัญหา
Alternative output format - XStream รองรับรูปแบบเอาต์พุตอื่น ๆ เช่น JSON และ morphing
การใช้งานทั่วไป
Transport - XML คือการแสดงข้อความของวัตถุและสามารถใช้ในการขนส่งวัตถุผ่านสายไฟโดยไม่ขึ้นอยู่กับเทคนิคการทำให้เป็นอนุกรม / การแยกสารที่ใช้
Persistence - ออบเจ็กต์สามารถคงอยู่ในรูปแบบ XML ในฐานข้อมูลและสามารถเป็นแบบมาร์แชลล์ / ไม่เป็นรูปเป็นร่างและเมื่อจำเป็น
Configuration- XML เป็นคำอธิบายในตัวเองและถูกใช้อย่างมากเพื่อกำหนดการกำหนดค่า ออบเจ็กต์ยังสามารถใช้เพื่อวัตถุประสงค์ในการกำหนดค่าหลังจากแปลงเป็นตัวแทน XML
Unit Tests - XStream API เข้ากันได้กับ JUnit และสามารถใช้เพื่อปรับปรุงการทดสอบหน่วยของโมดูลแอปพลิเคชัน
ในบทนี้เราจะพูดถึงแง่มุมต่างๆของการตั้งค่าสภาพแวดล้อมที่เหมาะสำหรับ Java
การตั้งค่าสภาพแวดล้อมท้องถิ่น
หากคุณต้องการตั้งค่าสภาพแวดล้อมของคุณสำหรับภาษาการเขียนโปรแกรม Java ส่วนนี้จะอธิบายวิธีดาวน์โหลดและตั้งค่า Java บนเครื่องของคุณ โปรดทำตามขั้นตอนด้านล่างเพื่อตั้งค่าสภาพแวดล้อม Java ของคุณ
สามารถดาวน์โหลด Java SE ได้ฟรีจากลิงค์ -
ดาวน์โหลด Java
ทำตามคำแนะนำเพื่อดาวน์โหลด Java และเรียกใช้ไฟล์ .exeเพื่อติดตั้ง Java บนเครื่องของคุณ เมื่อคุณติดตั้ง Java บนเครื่องของคุณแล้วคุณจะต้องตั้งค่าตัวแปรสภาพแวดล้อมให้ชี้ไปที่ไดเร็กทอรีการติดตั้งที่ถูกต้อง -
การตั้งค่าเส้นทางสำหรับ Windows 2000 / XP
สมมติว่าคุณติดตั้ง Java ในไดเร็กทอรีc: \ Program Files \ java \ jdk -
คลิกขวาที่ 'My Computer' และเลือก 'Properties'
คลิกปุ่ม "ตัวแปรสภาพแวดล้อม" ใต้แท็บ "ขั้นสูง"
แก้ไขตัวแปร 'Path' เพื่อให้มีพา ธ ไปยังไฟล์ปฏิบัติการ Java ตัวอย่างเช่นหากเส้นทางถูกตั้งค่าเป็น 'C: \ WINDOWS \ SYSTEM32' ให้เปลี่ยนเส้นทางของคุณเพื่ออ่าน 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin
การตั้งค่าเส้นทางสำหรับ Windows 95/98 / ME
สมมติว่าคุณติดตั้ง Java ในไดเร็กทอรีc: \ Program Files \ java \ jdk -
แก้ไขไฟล์ 'C: \ autoexec.bat' และเพิ่มบรรทัดต่อไปนี้ในตอนท้าย -
'SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin'
การตั้งค่าเส้นทางสำหรับ Linux, UNIX, Solaris, FreeBSD
ควรตั้งค่า PATH ตัวแปรสภาพแวดล้อมให้ชี้ไปที่ตำแหน่งที่ติดตั้งไบนารี Java อ้างถึงเอกสารประกอบเชลล์ของคุณหากคุณมีปัญหาในการดำเนินการนี้
ตัวอย่างเช่นหากคุณใช้bashเป็นเชลล์คุณจะต้องเพิ่มบรรทัดต่อไปนี้ที่ท้าย '.bashrc: export PATH = / path / to / java: $ PATH'
บรรณาธิการ Java ยอดนิยม
ในการเขียนโปรแกรม Java คุณจะต้องมีโปรแกรมแก้ไขข้อความ มี IDE ที่ซับซ้อนมากขึ้นในตลาด แต่ในตอนนี้คุณสามารถพิจารณาข้อใดข้อหนึ่งต่อไปนี้ -
Notepad - ใน Windows คุณสามารถใช้โปรแกรมแก้ไขข้อความธรรมดา ๆ เช่น Notepad (แนะนำสำหรับบทช่วยสอนนี้) หรือ TextPad
Netbeans - เป็น Java IDE ที่ฟรีและสามารถดาวน์โหลดได้จาก https://www.netbeans.org/index.html.
Eclipse - นอกจากนี้ยังเป็น Java IDE ที่พัฒนาโดยชุมชนโอเพนซอร์ส eclipse และสามารถดาวน์โหลดได้จาก https://www.eclipse.org/.
ดาวน์โหลด XStream Archive
ดาวน์โหลดไฟล์ XStream jar เวอร์ชันล่าสุดจาก xstream-1.4.7.jar ในขณะที่เขียนบทช่วยสอนนี้เราได้ดาวน์โหลดxstream-1.4.7.jarและคัดลอกลงในโฟลเดอร์ C: \> XStream
ระบบปฏิบัติการ | ชื่อที่เก็บถาวร |
---|---|
Windows | xstream-1.4.7.jar |
ลินุกซ์ | xstream-1.4.7.jar |
Mac | xstream-1.4.7.jar |
ตั้งค่า XStream Environment
ตั้งค่า XStream_HOMEตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งไดเร็กทอรีฐานที่เก็บ xstream jar ไว้ในเครื่องของคุณ ตารางต่อไปนี้แสดงวิธีการตั้งค่าสภาพแวดล้อม XStream บน Windows, Linux และ Mac โดยสมมติว่าเราได้แยก xstream-1.4.7.jar ในโฟลเดอร์ XStream
ซีเนียร์ | ระบบปฏิบัติการและคำอธิบาย |
---|---|
1 | Windows ตั้งค่าตัวแปรสภาพแวดล้อม XStream_HOME เป็น C: \ XStream |
2 | Linux ส่งออก XStream_HOME = / usr / local / XStream |
3 | Mac ส่งออก XStream_HOME = / Library / XStream |
ตั้งค่าตัวแปร CLASSPATH
ตั้งค่า CLASSPATHตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งโถ XStream ตารางต่อไปนี้แสดงวิธีตั้งค่าตัวแปร CLASSPATH บนระบบ Windows, Linux และ Mac โดยสมมติว่าเราได้จัดเก็บ xstream-1.4.7.jar ไว้ในโฟลเดอร์ XStream
ซีเนียร์ | ระบบปฏิบัติการและคำอธิบาย |
---|---|
1 | Windows ตั้งค่าตัวแปรสภาพแวดล้อม CLASSPATH เป็น% CLASSPATH%;% XStream_HOME% \ xstream-1.4.7.jar; |
2 | Linux ส่งออก CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
3 | Mac ส่งออก CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
ก่อนที่จะเข้าสู่รายละเอียดของไลบรารี XStream ให้เราดูแอปพลิเคชันที่ใช้งานได้จริง ในตัวอย่างนี้เราได้สร้างชั้นเรียนนักเรียนและที่อยู่ เราจะสร้างอ็อบเจ็กต์นักเรียนแล้วทำให้เป็นอนุกรมเป็นสตริง XML จากนั้นยกเลิกการทำให้อนุกรมสตริง XML เดียวกันเพื่อรับวัตถุนักเรียนกลับมา
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน 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
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
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
]
]
ขั้นตอนในการจำ
ต่อไปนี้เป็นขั้นตอนสำคัญที่จะต้องพิจารณาที่นี่
ขั้นตอนที่ 1: สร้างวัตถุ XStream
สร้างวัตถุ XStream โดยส่งผ่าน StaxDriver StaxDriver ใช้ Stax pull parser (มีให้จาก java 6) และเป็นตัวแยกวิเคราะห์ xml ที่รวดเร็ว
XStream xstream = new XStream(new StaxDriver());
ขั้นตอนที่ 2: จัดลำดับวัตถุเป็น XML
ใช้วิธี toXML () เพื่อรับการแสดงสตริง XML ของอ็อบเจ็กต์
//Object to XML Conversion
String xml = xstream.toXML(student);
ขั้นตอนที่ 3: De-serialize XML เพื่อรับ Object
ใช้ fromXML () วิธีการรับวัตถุจาก XML
//XML to Object Conversion
Student student1 = (Student)xstream.fromXML(xml);
นามแฝงเป็นเทคนิคในการปรับแต่ง XML ที่สร้างขึ้นหรือใช้ XML ที่จัดรูปแบบโดยเฉพาะโดยใช้ XStream สมมติว่าจะใช้รูปแบบ XML ต่อไปนี้เพื่อทำให้เป็นซีเรียลไลซ์ / เดอ - ซีเรียลไลซ์อ็อบเจ็กต์ Student
<student name = "Suresh">
<note>
<title>first</title>
<description>My first assignment.</description>
</note>
<note>
<title>second</title>
<description>My second assignment.</description>
</note>
</student>
ตามรูปแบบ 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;
}
}
ลองทดสอบการทำให้เป็นอนุกรมวัตถุข้างต้นโดยใช้ XStream
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน 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
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
ตรวจสอบผลลัพธ์ดังนี้ -
<?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>
จากผลลัพธ์ข้างต้นชื่อวัตถุ Student มีคุณสมบัติครบถ้วน หากต้องการแทนที่เป็นแท็กนักเรียนให้ทำตามหัวข้อถัดไป
นามแฝงของคลาส
นามแฝงฟิลด์
การใช้นามแฝงคอลเลกชันโดยนัย
ชื่อแทนแอตทริบิวต์
ชื่อแทนแพ็กเกจ
XStream รองรับคำอธิบายประกอบเช่นเดียวกับการกำหนดค่าอัตโนมัติแทนการเข้ารหัส ในบทที่แล้วเราได้เห็นการกำหนดค่าต่อไปนี้ในโค้ด
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");
ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นถึงการใช้คำอธิบายประกอบเพื่อทำงานเดียวกันในวิธีที่ง่ายกว่ามาก
@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
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream
ไฟล์: 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;
}
}
ตรวจสอบผลลัพธ์
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
ตรวจสอบผลลัพธ์ดังนี้ -
<?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 ประมวลผลคำอธิบายประกอบคุณต้องเพิ่มคำสั่งต่อไปนี้ก่อนทำให้เป็นอนุกรม xml
xstream.processAnnotations(Student.class);
หรือ
xstream.autodetectAnnotations(true);
ตัวแปลง XStream เป็นส่วนประกอบหลักของไลบรารี XStream ซึ่งมีหน้าที่แปลงวัตถุเป็น XML และในทางกลับกัน XStream มีตัวแปลงจำนวนมากสำหรับประเภททั่วไปเช่น primitives, String, File, Collections, Arrays และ Dates
ใช้ Converter
ให้เราใช้ SingleValueConvertor ซึ่งมีจุดประสงค์เพื่อแปลงวัตถุเป็นสตริงเดียว เราจะใช้ SingleValueConvertor เพื่อเขียนวัตถุเป็นสตริงแอตทริบิวต์
สร้างตัวแปลง
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);
}
}
ลงทะเบียนตัวแปลง
xstream.registerConverter(new NameConverter());
ตัวอย่างที่ไม่มีตัวแปลง
ก่อนอื่นให้เราทดสอบโค้ดที่ไม่มีตัวแปลงใน XStream
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน 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
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
ตรวจสอบผลลัพธ์ดังนี้ -
<?xml version = "1.0" encoding = "UTF-8"?>
<student>
<name>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</name>
</student>
ตัวอย่างกับ Converter
ตอนนี้ให้เราทดสอบโค้ดด้วยตัวแปลงใน XStream
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน 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
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
ตรวจสอบผลลัพธ์ดังนี้ -
<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh,Parashar"/>
ตัวแปลงที่กำหนดเอง
XStream จัดเตรียมการใช้งานทางเลือกของ java.io.ObjectInputStream และ java.io.ObjectOutputStream เพื่อให้สตรีมของอ็อบเจ็กต์สามารถต่ออนุกรมหรือ deserialized จาก XML ได้ สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อต้องประมวลผลวัตถุจำนวนมากโดยเก็บวัตถุหนึ่งชิ้นไว้ในหน่วยความจำทีละชิ้น
ไวยากรณ์: createObjectOutputStream ()
ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
new FileOutputStream("test.txt"));
ไวยากรณ์: createObjectInputStream ()
ObjectInputStream objectInputStream = xstream.createObjectInputStream(
new FileInputStream("test.txt"));
ตอนนี้ให้เราทดสอบโค้ดกับออบเจ็กต์สตรีมใน XStream
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream
ไฟล์: 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+ " ]";
}
}
ตรวจสอบผลลัพธ์
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
ตรวจสอบผลลัพธ์ดังนี้ -
Student [ firstName: Mahesh, lastName: Parashar ]
Student [ firstName: Suresh, lastName: Kalra ]
Student [ firstName: Ramesh, lastName: Kumar ]
Student [ firstName: Naresh, lastName: Sharma ]
Hello World
ดูเนื้อหาของ test.txt ที่ 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 รองรับ JSON โดยการเริ่มต้นวัตถุ XStream ด้วยไดรเวอร์ที่เหมาะสม ปัจจุบัน XStream รองรับ JettisonMappedXmlDriver และ JsonHierarchicalStreamDriver
ตอนนี้ให้เราทดสอบโค้ดด้วยการจัดการ json ใน XStream
สร้างไฟล์คลาส java ชื่อ XStreamTester ใน C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream
ไฟล์: 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+ " ]";
}
}
ตรวจสอบผลลัพธ์
รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
ตอนนี้เรียกใช้ XStreamTester เพื่อดูผลลัพธ์ -
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
ตรวจสอบผลลัพธ์ดังนี้ -
{
"firstName": "Mahesh",
"lastName": "Parashar"
}