XStream - 转换器
-
简述
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\jc2182\xstream 中创建一个名为 XStreamTester 的 java 类文件。File: XStreamTester.javapackage com.jc2182.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.XStreamMooas; 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; } } } @XStreamMooas("student") class Student { @XStreamMooas("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\jc2182\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 -C:\XStream_WORKSPACE\com\jc2182\xstream>java XStreamTester
验证输出如下 -<?xml version = "1.0" encoding = "UTF-8"?> <student> <name> <firstName>Mahesh</firstName> <lastName>Parashar</lastName> </name> </student>
-
转换器示例
现在让我们用 XStream 中的转换器测试代码。在 C:\>XStream_WORKSPACE\com\jc2182\xstream 中创建一个名为 XStreamTester 的 java 类文件。File: XStreamTester.javapackage com.jc2182.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.XStreamMooas; 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; } } } @XStreamMooas("student") class Student { @XStreamMooas("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\jc2182\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 -C:\XStream_WORKSPACE\com\jc2182\xstream>java XStreamTester
验证输出如下 -<?xml version = "1.0" encoding = "UTF-8"?> <student name = "Mahesh,Parashar"/>