开发手册 欢迎您!
软件开发者资料库

XStream - 转换器

XStream转换器 - 从简单和简单的步骤学习XStream库,从基本概念到高级概念,包括概述,环境设置,第一个应用程序,别名,注释,转换器,对象流,使用XStream编写JSON。

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

验证输出如下 :

自定义转换器