- XStream Tutorial
- XStream - Home
- XStream - Overview
- XStream - Environment Setup
- XStream - First Application
- XStream - Aliasing
- XStream - Annotations
- XStream - Converters
- XStream - Object Streams
- XStream - JSON
- XStream Useful Resources
- XStream - Quick Guide
- XStream - Useful Resources
- XStream - Discussion
XStream - Custom Converter
XStream allows writing a converter from scratch, so that the developer can write a completely new implementation on how to serialize an object to XML and vice versa. A converter interface provides three methods −
canConvert − It is a check for supported object type serialization.
marshal − It serializes an object to XML.
unmarshal − It de-serializes an object from XML.
Step 1: Implement Converter Interface
class StudentConverter implements Converter { public boolean canConvert(Class object) { return object.equals(Student.class); } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Student student = (Student) value; writer.startNode("name"); writer.setValue(student.getName().getFirstName() + "," + student.getName().getLastName()); writer.endNode(); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { reader.moveDown(); String[] nameparts = reader.getValue().split(","); Student student = new Student(nameparts[0],nameparts[1]); reader.moveUp(); return student; } }
Step 2: Register Converter
xstream.registerConverter(new StudentConverter());
Let us now test the code with converter in XStream.
Create a java class file named XStreamTester in 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.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 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 StudentConverter()); //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") 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 StudentConverter implements Converter { public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Student student = (Student) value; writer.startNode("name"); writer.setValue(student.getName().getFirstName() + "," + student.getName().getLastName()); writer.endNode(); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { reader.moveDown(); String[] nameparts = reader.getValue().split(","); Student student = new Student(nameparts[0],nameparts[1]); reader.moveUp(); return student; } public boolean canConvert(Class object) { return object.equals(Student.class); } }
Verify the Result
Compile the classes using javac compiler as follows −
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Now run the XStreamTester to see the result −
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Verify the output as follows −
<?xml version = "1.0" encoding = "UTF-8"?> <student> <name>Mahesh,Parashar</name> </student>
xstream_converters.htm
Advertisements