XStream - 自定义转换器
XStream 允许从头开始编写转换器,以便开发人员可以编写一个全新的实现,说明如何将对象序列化为 XML 以及反之亦然。转换器接口提供三种方法 −
canConvert − 检查是否支持对象类型序列化。
marshal − 将对象序列化为 XML。
unmarshal − 从 XML 反序列化对象。
步骤 1:实现转换器接口
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; } }
步骤 2:注册转换器
xstream.registerConverter(new StudentConverter());
现在让我们在 XStream 中使用转换器测试代码。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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); } }
验证结果
使用 javac 编译器编译类,如下所示 −
C:\XStream_WORKSPACE\com utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\xstream>java XStreamTester
验证输出,如下所示 −
<?xml version = "1.0" encoding = "UTF-8"?> <student> <name>Mahesh,Parashar</name> </student>