使用 XStream 把 Java 对象序列化为 XML
使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。
和其他序列化工具相比,XStream 有三个突出的特点:
不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。
?
需要下载 xstream-1.2.2.jar。
序列化对象
这个简单的例子示范了如何使用 XStream 序列化/逆序列化对象,包括两个类:Writer
和 Reader
。Writer
类使用 XStream API 把 Employee
类型的对象序列化为 XML 并存储到文件中(如 清单 1 所示)。
清单 1. Writer.java
package com.samples;import java.io.FileNotFoundException;import java.io.FileOutputStream;import com.thoughtworks.xstream.*;public class Writer { public static void main(String[] args) { Employee e = new Employee(); //Set the properties using the setter methods //Note: This can also be done with a constructor. //Since we want to show that XStream can serialize //even without a constructor, this approach is used. e.setName("Jack"); e.setDesignation("Manager"); e.setDepartment("Finance"); //Serialize the object XStream xs = new XStream(); //Write to a file in the file system try { FileOutputStream fs = new FileOutputStream("c:/temp/employeedata.txt"); xs.toXML(e, fs); } catch (FileNotFoundException e1) { e1.printStackTrace(); } }}
?
Reader
类读取该文件,逆序列化 XML 并把数据装入 Java 对象(如 清单 2 所示)。
清单 2. Reader.java
package com.samples;import java.io.FileInputStream;import java.io.FileNotFoundException;import com.thoughtworks.xstream.*;import com.thoughtworks.xstream.io.xml.DomDriver;public class Reader { public static void main(String[] args) { XStream xs = new XStream(new DomDriver()); Employee e = new Employee(); try { FileInputStream fis = new FileInputStream("c:/temp/employeedata.txt"); xs.fromXML(fis, e); //print the data from the object that has been read System.out.println(e.toString()); } catch (FileNotFoundException ex) { ex.printStackTrace(); } }}
?
清单 3 显示了 Employee
对象的结构。
清单 3. Employee.java
package com.samples;public class Employee { private String name; private String designation; private String department; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesignation() { return designation; } public void setDesignation(String designation) { this.designation = designation; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } @Override public String toString() { return "Name : "+this.name+ "\nDesignation : "+this.designation+ "\nDepartment : "+this.department; }}