XStream转换器是XStream库的关键组件,它负责将对象转换为XML,反之亦然. XStream为常见类型提供了大量转换器,例如基元,字符串,文件,集合,数组和日期.
使用转换器
让我们使用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中测试没有转换器的代码.
在C:\> XStream_WORKSPACE \com\it1352\ xstream中创建名为XStreamTester的java类文件.
文件:XStreamTester .java
package com.it1352.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; } }
验证结果
编译使用 javac 编译器的类如下 :
C:\XStream_WORKSPACE\com\it1352\xstream>javac XStreamTester.java
现在运行XStreamTester查看结果 :
C:\XStream_WORKSPACE\com\it1352\xstream>java XStreamTester
验证输出如下 :
Mahesh Parashar
转换器示例
现在让我们在XStream中使用转换器测试代码.
在C:\> XStream_WORKSPACE \com\it1352\ xstream中创建名为XStreamTester的java类文件.
文件:XStreamTester .java
package com.it1352.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); }}
验证结果
编译使用 javac 编译器的类如下 :
C:\XStream_WORKSPACE\com\it1352\xstream>javac XStreamTester.java
现在运行XStreamTester查看结果 :
C:\XStream_WORKSPACE\com\it1352\xstream>java XStreamTester
验证输出如下 :