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轉換器的代碼測試。
創建一個Java類名爲XStreamTester文件在 C:\>XStream_WORKSPACE\com\yiibai\xstream.
File: XStreamTester.java
package com.yiibai.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\yiibai\xstream>javac XStreamTester.java
現在運行XStreamTester看到的結果:
C:\XStream_WORKSPACE\com\yiibai\xstream>java XStreamTester
驗證輸出